查询来自两个关联表的数据

时间:2013-01-11 23:39:39

标签: sql ruby-on-rails rails-activerecord

对于我的应用:

  • 用户has_many图片,图片belongs_to用户
  • 图片has_one位置,位置belongs_to图像

也许位置的字段应该只是图像的一部分。但无论如何,我正在尝试在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查询?

1 个答案:

答案 0 :(得分:1)

我想您想了解 Eager Loading Associations

@images = Image.includes(:location).where("images.user_id = ?", 5)

这将找到Imageuser_id = 5个实例。然后它运行第二个查询JOIN并构建关联的Location实例(这就是.includes(:location)将为您做的事情)

这更接近您的备用查询,因为它会从imageslocation表中选择所有列。

您可以基于此构建一个数组,其中包含一个只有您感兴趣的键的哈希。

@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。不过很高兴知道。