【问题标题】:Modeling Relationships with Four or More Models in RailsRails 中四个或更多模型的建模关系
【发布时间】:2013-04-27 07:48:13
【问题描述】:

我的 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_idgroup(来自group_foo_type)。

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    正如this answer 中提到的,从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中的关联方法可以和各种finder方法一起使用,所以通过group_foo_type来限制foos:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-03-28
      • 2021-01-24
      • 1970-01-01
      • 2023-03-07
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      相关资源
      最近更新 更多