2011-10-13 141 views
0

我有2種型號:軌活動記錄關聯SQL行爲

# models/car.rb 
class Car < ActiveRecord::Base 
    belongs_to :model 
end 

# models/manufacturer.rb 
class Manufacturer < ActiveRecord::Base 
    has_many :cars 
end 

當我在軌控制檯執行命令Car.find(1).manufacturer它表明我多了一個SQL查詢被執行SELECT manufacturers.* FROM manufacturers WHERE manufacturers.id = 54 LIMIT 1

所以我感興趣的是它通常(生產,首先)的行爲,當很多SQL查詢被執行只是爲了得到一些對象親perty?表演怎麼樣?

UPDATE,回答: 我從另一個源的答案:有人告訴我,這是「必要之惡」作爲抽象

回答

2

支付這不是一個「必要之惡」和你的直覺,第二查詢是不必要的是正確的。你需要做的是使用:include/includes來告訴Rails做一個JOIN來獲取相同的SELECT中的關聯對象。所以,你可以這樣做:

Car.find 1, :include => :manufacturer 

# or, in Rails 3 parlance: 

Car.includes(:manufacturer).find 1 

的Rails稱此爲「預先加載」,你可以read more about it in the documentation(向下滾動或按Ctrl + F爲「協會的預先加載」)。

如果總是想急於加載你可以在模型聲明default_scope的相關對象:

class Car 
    belongs_to :manufacturer 

    default_scope :include => :manufacturer 

    # or Rails 3: 

    default_scope includes(:manufacturer) 
end 

然而,你不應該這樣做,除非你真的需要每次相關的製造商你顯示一個Car記錄。

+0

謝謝,非常好的解釋! – user973254