我在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
)。
有人可以帮助推荐一种方法来完成我想做的事情吗?谢谢!
答案 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_member
和user
)。
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指南以获取更多信息。)
小心:在后台有很多步骤需要继续实现这些功能,即使实际编码相对容易。您可能希望密切关注生成的查询(通过控制台或日志)以及它们的执行方式,因为它们可能会得到相当大的参与。看起来你有一套相当复杂的关联,所以值得看一下你是否可以在那里简化任何事情。请记住一些事情!