0

对于我的应用程序:

  • 用户有_许多图像,图像属于_用户
  • 图像 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 查询?

4

1 回答 1

1

我认为您想阅读有关Eager Loading Associations的信息。

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

这将Image找到user_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没有关联的实例Location。您可以修改joins()一点来帮助解决这个问题,但上面会有这个遗漏。


如果您真的只想选择特定的列,请阅读Selecting Specific Columns尽管有使用此功能的警告

如果使用 select 方法,所有返回的对象都将是只读的。

请小心,因为这也意味着您正在初始化一个仅使用您选择的字段的模型对象。


在 Rails master(不在 3.2.11 中)中,您可以将多个列传递给,.pluck()但这似乎仅限于单个表(您将无法获取locations表的:latitude:longitude从 中提取时Image。不过很高兴知道。

于 2013-01-11T23:44:38.180 回答