rails活动记录关联sql行为

时间:2011-10-13 17:27:45

标签: mysql sql ruby-on-rails ruby activerecord

我有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查询被执行时才获得一些对象属性?性能怎么样?

更新,答案: 我从另一个消息来源得到了答案:我被告知它是“必要的邪恶”作为抽象付款

1 个答案:

答案 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

但是,除非您每次显示汽车记录时确实需要关联的制造商,否则不应该这样做。