2010-03-14 81 views
0

只是好奇,我花了一段時間,試圖獲得一個嵌套模型中的所有記錄數組尷尬的時間。我只是想確保沒有更好的方法。Ruby on Rails:選擇嵌套模型的所有記錄的簡單方法?

下面是設置:

我有嵌套在彼此(設施>>標籤>>檢查)三種模式,產生這樣的代碼的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 

它的工作原理,但是這是要做到這一點的最好辦法 - 我認爲這是很麻煩。

回答

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 

但如果你有基金之間HABTM關係,標籤會更復雜,你會寫一些SQL像這樣:

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

當然上面的代碼取決於你的表結構。如果你會顯示它,那麼給予正確答案會更容易:)。希望能幫助到你!

+0

斑點Klew,仍然有點尷尬,但我不在乎,因爲這很好。謝謝,你說得對,現在它是一對多的,但是如果我遇到了HABTM,那麼知道我將不得不寫一些sql。 謝謝! –

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

這對數據庫執行(你原來的解決方案將使用其中不乏)一個查詢,並返回一個對象的設施與所有的標籤和檢查包括在內。然後,您可以執行如下操作:

@inspections = @facility.tags.map(&:inspections).flatten 
相關問題