2012-06-22 104 views
2

我有一个seat对象,它具有一个的car对象,它具有name。我想将carbrandcarownername一起显示。我如何在一个查询中执行此操作?嵌套关联/加入导轨

如:

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 

我会注意到,这是一个高度人为的例子,以简化我的问题。我连续做了几千次,因此需要更高的效率。

+2

检查实际查询 - 我怀疑'汽车'被抬头两次;也许'品牌'和'名字'正在查询两个查询,虽然... – sarnold

+0

感谢您的评论。你完全正确。我会修改这个问题。 – Peter

回答

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 
0

使用default_scope

class Seat 
    default_scope includes([:car]) 
end 

class Car 
    default_scope includes([:owner, :seats]) 
end 
+0

'default_scope'是邪恶的。 –

+0

meh。 。 。 。 。 。 –

+0

不需要方括号。 –

0

对于多表连接所经常使用在我的申请,我在MySQL中创建一个视图。然后根据视图创建一个ActiveRecord Rails模型。

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

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

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