通过多个表获取记录

时间:2012-10-25 19:06:48

标签: ruby-on-rails

图像显示了我数据模型的一部分。我想获取与用户关联的所有项目(通过组织和items_group)。我该如何更改模型并在控制器中编写此查询?使用:through =>组织我可以获得所有items_groups但我不知道如何在查询相关项目中包含一个以上的关系。

enter image description here

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

2 个答案:

答案 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

希望它适合你!