对于我的应用:
也许位置的字段应该只是图像的一部分。但无论如何,我正在尝试在Rails中编写此查询:
SELECT image.caption, location.latitude, location.longitude
FROM image, location
WHERE location.image_id = image.id
AND image.user_id = 5
或者,如果它更容易:
SELECT image.*, location.*
FROM image, location
WHERE location.image_id = image.id
AND image.user_id = 5
我如何将其写为ActiveRecord查询?
答案 0 :(得分:1)
我想您想了解 Eager Loading Associations 。
@images = Image.includes(:location).where("images.user_id = ?", 5)
这将找到Image
个user_id = 5
个实例。然后它运行第二个查询JOIN
并构建关联的Location
实例(这就是.includes(:location)
将为您做的事情)。
这更接近您的备用查询,因为它会从images
和location
表中选择所有列。
您可以基于此构建一个数组,其中包含一个只有您感兴趣的键的哈希。
@hash_object = @images.collect { |i| { caption: i.caption, latitude: i.location.latitude, longitude: i.location.longitude } }
如果您只想使用一个查询构建此内容,则可以将.joins(:location)
与.includes(:location)
结合使用
Image.joins(:location).includes(:location).where("images.user_id = ?", 5)
重要提示:这将省略没有联合Image
的{{1}}个实例。您可以修改Location
以帮助解决此问题,但上述内容将有此遗漏。
如果您确实只想要选择特定列,请阅读 Selecting Specific Columns ,尽管有使用此
的警告如果使用select方法,则所有返回的对象都是只读的。
和
要小心,因为这也意味着您只使用您选择的字段初始化模型对象。
在Rails master(不在3.2.11中)中,您可以将多列传递给.pluck()
,但这似乎只限于一个表(你不会'从joins()
采摘时,能够获得locations
表的:latitude
和:longitude
。不过很高兴知道。