在Rails中建模与四种或更多模型的关系

时间:2013-05-03 00:40:44

标签: ruby-on-rails

我在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

我想要做的是,对于一个小组,找到每个用户的foos和bars考虑到该组的foo_type_id(来自group_foo_type)。

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

从这一点来看,似乎我可以group.group_members.user获取用户,然后user.foos' and 'user.bars获取用户的foos和bar。这不会考虑foo_type_id的{​​{1}}(来自group)。

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

1 个答案:

答案 0 :(得分:0)

this answer中所述,自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会给你所有小组的元素(通过group_memberuser)。

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

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

group_foo_type_ids是另一种有用的关联方法,请查看Association Basics指南以获取更多信息。)

小心:在后台有很多步骤需要继续实现这些功能,即使实际编码相对容易。您可能希望密切关注生成的查询(通过控制台或日志)以及它们的执行方式,因为它们可能会得到相当大的参与。看起来你有一套相当复杂的关联,所以值得看一下你是否可以在那里简化任何事情。请记住一些事情!