好吧,我对 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,相当令人困惑......