2

我有一个seat对象,该car对象具有一个owner具有a 的对象name。我想同时显示 thecar brandcar' owners name。如何在一个查询中执行此操作?

例如:

class Seat < ActiveRecord::Base
  belongs_to :car

  def description
    "I am in a #{car.brand} belonging to #{car.owner.name}"
    # --> how do I replace this with one query?
  end
end

我会注意到这是一个非常人为的例子来简化我的问题。我连续数千次这样做,因此需要更高的效率。

4

3 回答 3

3

假设您正在尝试查询Seat模型,并且想要预先加载汽车和所有者对象,您可以使用该includes子句。

Seat.includes(:car => :owner).where(:color => :red).each do |seat|
  "I am in a #{seat.car.brand} belonging to #{seat.car.owner.name}"
end
于 2012-06-22T02:57:05.040 回答
0

利用default_scope

class Seat
  default_scope includes([:car])
 end

class Car
  default_scope includes([:owner, :seats])
end
于 2012-06-22T02:36:21.770 回答
0

对于我的应用程序中经常使用的多表连接,我在 MySQL 中创建了一个视图。然后基于视图创建一个 ActiveRecord Rails 模型。

根据驱动视图的 SQL 语句,MySQL 甚至可以让视图被读/写。但我只是走简单的路线,总是将视图视为只读的。您可以将 AR 模型设置为只读。

通过使用使用视图的 Active Record 模型,您可以快速读取数据库的单个查询。而且它们甚至比平常更快,因为 MySQL 为视图计算一次 SQL“计划”,从而可以更快地使用它。

请记住还要检查您的外键是否都已编入索引。您不想要任何表扫描。

于 2012-06-22T02:46:15.140 回答