1

Rails でアソシエーションを操作する方法、具体的には、明示的な SQL コードを記述する場合としない場合を把握しようとしています。

私のアプリケーションには、次のように定義された 4 つのモデルがあります。

class User < ActiveRecord::Base
    has_many :comments
    has_many :geographies
    has_many :communities, through: :geographies

class Comment < ActiveRecord::Base
    belongs_to :user

class Community < ActiveRecord::Base
    has_many :geographies
    has_many :users

class Geography < ActiveRecord::Base
    belongs_to :user
    belongs_to :community

ユーザーはコメントを投稿でき、geography テーブルを介して 1 つ以上のコミュニティに関連付けられます (geography テーブルにはuser_idおよびが格納されますcommunity_id)。

すべてのコメントを一覧表示するインデックス アクションがあり、コミュニティでフィルター処理したいと考えています。コメント オブジェクトを指定すると、 を介してユーザー オブジェクトを取得できますがcomment.user、それを超えてチェーンすることはできません (つまり、 のようなものcomment.user.geography(0).communityは機能しません)。

このオブジェクトチェーンは Rails の重要な機能のようですが、has_many :through アソシエーションで機能しますか? 私の例では、オブジェクト チェーンを使用してコメント オブジェクトからコミュニティ オブジェクトを取得することは可能ですか? または、コメント オブジェクトが与えられたときにユーザー以外のものを取得するには、SQL を記述する必要がありますか?

4

2 に答える 2

0

ユーザーは複数のコミュニティに関連付けられているため、ActiveRecord(または生のSQL)に必要なコミュニティを指示する必要があります。

comment.user.communities #=> should give you all the communities

すべてのコミュニティを取得することに特に関心がなく、任意のコミュニティを取得したい場合

comment.user.communities.first #=> should give you the first community

ただし、一般的には、条件に基づいて、特定の1つのコミュニティに関心があります。

comment.user.communities.where(name: 'Europe') #=> should give you the European community.
于 2012-07-01T16:16:20.803 に答える
0

geographies テーブルは必要ないと思います。

試す

class Community < ActiveRecord::Base
    has_many :users
end

class User < ActiveRecord::Base
    belongs_to :community
    has_many :comments
end

class Comment < ActiveRecord::Base
    belongs_to :user
end

次に、コメントのユーザーのコミュニティにアクセスできます @comment.user.community

于 2012-07-01T05:42:15.997 に答える