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),找到每个用户的 foos 和 bar。

但是,我不确定我是否正确建模。

由此看来,我似乎可以group.group_members.user先获取用户,然后再user.foos' and 'user.bars获取用户的 foos 和 bar。这没有考虑到foo_type_id尽管group(从group_foo_type)。

有人可以帮忙推荐一种方法来完成我想做的事情吗?谢谢!

4

1 回答 1

0

正如这个答案中提到的,从 Rails 3.1 开始,您可以嵌套has_many :through关联。因此,要轻松访问组的所有 foos 和 bar,您可以添加以下关联:

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

有了这个,group.foos会给你所有组的 foos(通过group_memberuser)。

rails 中的关联方法可以与各种 finder 方法一起使用,因此可以通过以下方式限制 foos group_foo_type

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

group_foo_type_ids作为另一种有用的关联方法,请查看关联基础指南以获取更多信息。)

一个警告:有很多步骤必须在后台进行才能实现任何这些东西,即使它确实相对容易实际编码。您可能需要密切关注生成的查询(通过控制台或日志)以及它们的执行方式,因为它们可能会相当参与。看起来你在那里有一组相当复杂的关联,所以你是否可以在那里简化任何东西可能值得一看。只是要记住一点!

于 2013-05-03T02:28:30.013 回答