好奇的是,我花了一大笔时间试图在嵌套模型中获取所有记录的数组。我只是想确保没有更好的方法。
以下是设置:
我有三个互相嵌套的模型(设施>>标签>>检查),为routes.rb生成这样的代码:
map.resources :facilities do |facilities|
facilities.resources :tags, :has_many => :inspections
end
我希望得到一个设施的所有检查,这就是我的代码最终成为:
def facility_inspections
@facility = Facility.find(params[:facility_id])
@inspections = []
@facility.tags.each do |tag|
tag.inspections.each do |inspection|
@inspections << inspection
end
end
end
它有效,但这是最好的方法 - 我认为这很麻烦。
答案 0 :(得分:3)
您可以使用has_many :through
关联。在你的模特中:
# Facility model
has_many :tags
has_many :inspections, :through => :tags
# Tag model
belongs_to :facility
has_many :inspections
你可以得到这样的所有检查:
@inspections = Facility.find(params[:facility_id]).inspections
但是如果你在Facility和Tag之间有HABTM关系会更复杂,你必须编写一些sql manualy,如下所示:
@inspections = Inspection.all(:joins => "INNER JOIN tags ON tags.id = inspections.tag_id INNER JOIN facilities_tags ON tags.id = facilities_tags.tag_id", :conditions => ["facilities_tags.facility_id = ?", params[:facility_id] )
当然上面的代码取决于你的表结构。如果你会展示它,那么给出正确答案会更容易:)。希望它有所帮助!
答案 1 :(得分:0)
@facility = Facility.find(params[:facility_id], :include => {:tags => :inspections})
这将对数据库执行一个查询(您的原始解决方案将使用其中许多解决方案),并返回包含所有标记和检查的工具对象。然后你可以做类似的事情:
@inspections = @facility.tags.map(&:inspections).flatten