0

好吧,我对 Rails 查询感到困惑。例如:

Affiche belongs_to :place
Place has_many :affiches

我们现在可以这样做:

@affiches = Affiche.all( :joins => :place )

或者

@affiches = Affiche.all( :include => :place )

如果有很多附属品,我们会得到很多额外的选择:

Place Load (0.2ms)  SELECT "places".* FROM "places" WHERE "places"."id" = 3 LIMIT 1
Place Load (0.3ms)  SELECT "places".* FROM "places" WHERE "places"."id" = 3 LIMIT 1
Place Load (0.8ms)  SELECT "places".* FROM "places" WHERE "places"."id" = 444 LIMIT 1
Place Load (1.0ms)  SELECT "places".* FROM "places" WHERE "places"."id" = 222 LIMIT 1
...and so on...

并且(原文如此!):joins使用 everySELECT加倍!

从技术上讲,我们云只是这样写:

@affiches = Affiche.all( )

结果完全一样!(因为我们声明了关系)。将所有数据保留在一个查询中的方法是删除关系并使用“LEFT OUTER JOIN”编写一个大字符串,但仍然存在将数据分组到多维数组中的问题以及类似列名的问题,例如id

做错了什么?或者我做错了什么?

更新:

好吧,我有那个字符串Place Load (2.5ms) SELECT "places".* FROM "places" WHERE ("places"."id" IN (3,444,222,57,663,32,154,20))和一个一一选择的列表id。奇怪,但是当我在each范围内执行此操作时,我会得到这些单独的选择:

 <%= link_to a.place.name, **a.place**( :id => a.place.friendly_id ) %>

标记a.place的是产生这些额外查询的位置。

更新 2:

让我做一些数学运算。在控制台中,我们有:

 Affiche Load (1.8ms)  SELECT affiches.*, places.name FROM "affiches" LEFT OUTER JOIN "places" ON "places"."id" = "affiches"."place_id" ORDER BY affiches.event_date DESC
 <VS>
 Affiche Load (1.2ms)  SELECT "affiches".* FROM "affiches"
 Place Load (2.9ms)  SELECT "places".* FROM "places" WHERE ("places"."id" IN (3,444,222,57,663,32,154,20))

出来:1.8ms 与 4.1ms,相当令人困惑......

4

1 回答 1

2

这里有些东西真的很奇怪,因为:includeoption 旨在place_id从每个 affche 中收集属性,然后使用这样的 select 查询一次获取所有位置:

select * from places where id in (3, 444, 222)

您可以在 Rails 控制台中检查。只需启动它并运行该代码段:

ActiveRecord::Base.logger = Logger.new STDOUT
Affiche.all :include => :place 

您可能会偶然地获取affiches,而实际上并未在代码中的某处包含位置,而不是为每个affiche 调用place 来制作rails 以对它们中的每一个执行单独的查询。

于 2011-11-19T17:23:18.350 回答