Ruby on Rails: Simple way to select all records of a nested model?

前提是你 提交于 2020-01-17 08:30:32

问题


Just curious, I spent an embarrassing amount of time trying to get an array of all the records in a nested model. I just want to make sure there is not a better way.

Here is the setup:

I have three models that are nested under each other (Facilities >> Tags >> Inspections), producing code like this for routes.rb:

map.resources :facilities do |facilities|
  facilities.resources :tags, :has_many => :inspections 
end

I wanted to get all of the inspections for a facility and here is what my code ended up being:

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

It works but is this the best way to do this - I think it's cumbersome.


回答1:


You can use has_many :through association. In your models:

# Facility model
has_many :tags
has_many :inspections, :through => :tags

# Tag model
belongs_to :facility
has_many :inspections

And you can get all inspections like this:

@inspections = Facility.find(params[:facility_id]).inspections

But if you have HABTM relation between Facility and Tag it will be more complicated and you would have to write some sql manualy, like this:

@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] )

Of course above code depends on your table structure. If you will show it, then it would be easier to give correct answer :). Hope it helps!




回答2:


@facility = Facility.find(params[:facility_id], :include => {:tags => :inspections})

This executes one query against the database (your original solution would use many of them), and returns a facility object with all the tag and inspections included. Then you can do something like:

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


来源:https://stackoverflow.com/questions/2441357/ruby-on-rails-simple-way-to-select-all-records-of-a-nested-model

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!