0

Rails アプリには次のモデルがあります。

group.rb
  has_many :group_members
  has_many :group_foo_types


group_member.rb
  # fields
  :group_id, :user_id 

  belongs_to:group
  has_many :group_foo_types, :through=>:groups
  has_one :user
  has_many :foo, :through=>:user
  has_many :bar, :through=>:user


group_foo_type.rb
  # fields
  :group_id, :foo_type_id

  belongs_to :group    
  belongs_to :foo_type


user.rb
  has_many :foo
  has_many :bar


foo.rb
  # fields
  :user_id, :foo_type_id

  belongs_to :user
  belongs_to :foo_type


bar.rb
  # fields
  :user_id, :foo_type_id

  belongs_to :user
  belongs_to :foo_type

私がやろうとしているのは、グループの場合、グループの foo_type_id (group_foo_type から) を考慮して、ユーザーごとに foo と bar を見つけることです。

ただし、これが正しくモデル化されているかどうかはわかりません。

group.group_members.userこのことから、ユーザーを取得してuser.foos' and 'user.barsから、ユーザーの foo と bar を取得することができるようです。ただし、これは(from から)を考慮していませfoo_type_idん。groupgroup_foo_type

誰かが私がやりたいことを達成するためのアプローチを推奨するのを手伝ってもらえますか? ありがとうございました!

4

1 に答える 1

0

この回答で述べたように、Rails 3.1 以降、関連付けをネストできますhas_many :through。したがって、グループのすべての foo と bar に簡単にアクセスできるようにするには、次の関連付けを追加できます。

# group.rb
has_many :users, through: :group_members
has_many :foos, through: :users
has_many :bars, through: :users

これによりgroup.foos、グループのすべての foo が得られます ( および を介しgroup_memberuser)。

Rails の関連付けメソッドは、さまざまなファインダー メソッドで使用できるため、foo を次のように制限しgroup_foo_typeます。

group_foos = group.foos.where(foo_type_id: group.group_foo_type_ids)

(group_foo_type_idsこれはもう 1 つの便利な関連付け方法です。詳細については、Association Basicsガイドを確認してください。)

注意: 実際にコーディングするのが比較的簡単になったとしても、このようなことを実現するためにバックグラウンドで実行する必要がある多くの手順があります。(コンソールまたはログのいずれかを介して) 生成されるクエリとその実行方法に注目することをお勧めします。そこにはかなり複雑な一連の関連付けがあるように見えるので、そこで単純化できるかどうかを調べる価値があるかもしれません。心に留めておくべきことだけです!

于 2013-05-03T02:28:30.013 に答える