Ruby on Rails:选择嵌套模型的所有记录的简单方法?

时间:2010-03-14 06:06:13

标签: ruby nested models

好奇的是,我花了一大笔时间试图在嵌套模型中获取所有记录的数组。我只是想确保没有更好的方法。

以下是设置:

我有三个互相嵌套的模型(设施>>标签>>检查),为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

它有效,但这是最好的方法 - 我认为这很麻烦。

2 个答案:

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