积极的记录关系 - 谁需要它?

时间:2011-11-19 17:11:17

标签: ruby-on-rails activerecord database-relations

好吧,我对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使用SELECT并且(sic!)加倍!

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

@affiches = Affiche.all( )

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

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

更新:

好吧,我有一个字符串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 ) %> 是生成这些额外查询的地点。

更新2:

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

a.place

出来:1.8ms对4.1ms,差不多,令人困惑......

1 个答案:

答案 0 :(得分:2)

这里有些奇怪,因为:include选项旨在从每个affiche收集place_id属性,然后使用选择查询一次获取所有位置:

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

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

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

你可能偶然会在没有实际包含代码中某处的位置而不是为每一个调用地点来调用地方,而是让每个地方都需要为每个地方执行单独的查询。