图像显示了我数据模型的一部分。我想获取与用户关联的所有项目(通过组织和items_group)。我该如何更改模型并在控制器中编写此查询?使用:through =>组织我可以获得所有items_groups但我不知道如何在查询相关项目中包含一个以上的关系。
class User < ActiveRecord::Base
has_and_belongs_to_many :organizations
has_many :items_groups, :through => :organizations
end
class Organization < ActiveRecord::Base
has_and_belongs_to_many :users
has_and_belongs_to_many :items_groups
has_many :items, :through => :items_groups
end
class ItemsGroup < ActiveRecord::Base
has_many :items, :inverse_of => :items_group
has_and_belongs_to_many :organizations
has_many :users, :through => :organizations
end
答案 0 :(得分:4)
我认为您可能需要从头到尾进行操作,并找到与您的用户相关联的项目。
您可以在User类中定义这样的方法:
def items
Item.joins(:items_group => {:organizations => :users}).where("users.id" => self.id).select("distinct items.*")
end
由于显式select
,它返回的项目将是只读的,但我认为您希望避免多次返回单个项目。
答案 1 :(得分:0)
如果您在模型中设置了应该起作用的关系:
users.organizations.item_groups.items
虽然要使它工作,你的模型应该包含:
class User < ActiveRecord::Base
has_many :organizations, :through => :organization_users
end
class Organization < ActiveRecord::Base
has_many :item_groups, :through => :items_groups_organizations
end
class ItemsGroup < ActiveRecord::Base
belongs_to :item
end
希望它适合你!