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

RubyonRails:选择嵌套模型的所有记录的简单方法?,ruby,nested,models,Ruby,Nested,Models,出于好奇,我花了大量令人尴尬的时间试图获取嵌套模型中所有记录的数组。我只是想确定没有更好的办法 以下是设置: 我有三个相互嵌套的模型(设施>>标签>>检查),为routes.rb生成如下代码: map.resources :facilities do |facilities| facilities.resources :tags, :has_many => :inspections end 我想对一个设施进行所有检查,下面是我的代码: def facility_inspection

出于好奇,我花了大量令人尴尬的时间试图获取嵌套模型中所有记录的数组。我只是想确定没有更好的办法

以下是设置:

我有三个相互嵌套的模型(设施>>标签>>检查),为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
def设施检查
@facility=facility.find(参数[:facility\u id])
@检查=[]
@facility.tags.each do|tag|
标记检查。每个do |检查|
@检查
这将对数据库执行一个查询(您的原始解决方案将使用许多查询),并返回一个包含所有标记和检查的设施对象。然后,您可以执行以下操作:

@inspections = @facility.tags.map(&:inspections).flatten
这将对数据库执行一个查询(您的原始解决方案将使用许多查询),并返回一个包含所有标记和检查的设施对象。然后,您可以执行以下操作:

@inspections = @facility.tags.map(&:inspections).flatten

您可以通过关联使用
has\u many:。在您的模型中:

# 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
@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] )
但如果设施和标记之间存在HABTM关系,则会更加复杂,您必须手动编写一些sql,如下所示:

@inspections = Facility.find(params[:facility_id]).inspections
@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] )

当然,上面的代码取决于您的表结构。如果你愿意展示它,那么给出正确的答案会更容易:)。希望有帮助

您可以通过关联使用
has\u many:through
association。在您的模型中:

# 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
@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] )
但如果设施和标记之间存在HABTM关系,则会更加复杂,您必须手动编写一些sql,如下所示:

@inspections = Facility.find(params[:facility_id]).inspections
@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] )

当然,上面的代码取决于您的表结构。如果你愿意展示它,那么给出正确的答案会更容易:)。希望有帮助

点点克莱,还是有点尴尬,但我不在乎,因为这很有效。谢谢,你是对的,现在是一对多,但是将来如果我遇到HABTM,我很高兴知道我必须编写一些sql。谢谢点点克莱,还是有点尴尬,但我不在乎,因为这很有效。谢谢,你是对的,现在是一对多,但是将来如果我遇到HABTM,我很高兴知道我必须编写一些sql。谢谢