使用has_many中的连接表记录通过活动记录查询进行访问:通过关系

时间:2012-03-05 07:05:32

标签: ruby-on-rails ruby-on-rails-3 activerecord join has-many-through

我有项目,地区和类别表,他们通过item_region和item_category表加入他们的关系如下

class Item < ActiveRecord::Base    
  has_many :item_region    
  has_many :region, :through => :item_region    
  has_many :item_category    
  has_many :category, :through => :item_category    

class Region < ActiveRecord::Base    
  has_many :category    
  has_many :item, ::through => :item_category    

class ItemRegion < ActiveRecord::Base    
  belongs_to :item    
  belongs_to :region    
end    

class Category < ActiveRecord::Base    
  has_many :item, :through => :item_category    
  has_many :item_category    

class ItemCategory < ActiveRecord::Base    
  belongs_to :item    
  belongs_to :category    
end     

我想使用连接表从region_id,category_id和item_id中找到item和category_name以及region_name的所有字段。

感谢。

1 个答案:

答案 0 :(得分:0)

我希望我把这个弄错了。如何获得所需的项目,然后从中获取所需的区域和类别。

item = Item.find(item_id)
region = item.regions.where(:id => region_id) 
category = item.categories.where(:id => category_id)

另一个建议是,你最好为你的协会提供复数形式。它直观地为object.collections关联执行has_many。请注意,Rails仍将使用上面的代码,但不遵循Rails的CoC(约定优于配置)原则。如果遵循惯例,则不必进行大量配置。

查看此处的示例http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

就个人而言,我更喜欢将Item模型中的关联作为:

class Item < ActiveRecord::Base    
  has_many :item_regions    
  has_many :regions, :through => :item_regions    
  has_many :item_categories    
  has_many :categories, :through => :item_categories