我有2个型号:
# models/car.rb
class Car < ActiveRecord::Base
belongs_to :model
end
和
# models/manufacturer.rb
class Manufacturer < ActiveRecord::Base
has_many :cars
end
当我在rails console Car.find(1).manufacturer
中执行命令时,它向我显示还执行了一个sql查询SELECT manufacturers.* FROM manufacturers WHERE manufacturers.id = 54 LIMIT 1
,
所以我感兴趣的是它通常(对于生产,首先)的行为,当很多sql查询被执行时才获得一些对象属性?性能怎么样?
更新,答案: 我从另一个消息来源得到了答案:我被告知它是“必要的邪恶”作为抽象付款
答案 0 :(得分: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
但是,除非您每次显示汽车记录时确实需要关联的制造商,否则不应该这样做。