【问题标题】:Rails optional association queryRails 可选关联查询
【发布时间】:2015-11-02 17:39:43
【问题描述】:

我已经尝试解决这个问题一段时间了,但没有成功:(

我有2个模型类——ConfigurationKey和ConfigurationItem,如下:

class ConfigurationKey < ActiveRecord::Base
    has_many :configuration_items

    # this class also has a 'name' attribute
end

class ConfigurationItem < ActiveRecord::Base
    belongs_to :app
    belongs_to :configuration_key
end

我想在一个查询中获取所有具有特定“名称”属性的 ConfigurationKey,以及与其关联的 ConfigurationItem 的过滤子集。

我使用了以下命令:

configuration_key = ConfigurationKey.includes(:configuration_items).where(name: key_name, configuration_items: { app: [nil, app] })

但没有任何关联 ConfigurationItems 的 ConfigurationKeys 不会返回。

我认为 'includes' 子句或明确使用 'LEFT OUTER JOIN' 会使其工作,但它没有:/

是否有任何可能的方法来做到这一点,或者我必须使用 2 个查询 - 一个获取所有相关的 ConfigurationKey,另一个获取所有相关的 ConfigurationItems?

谢谢 ;)

【问题讨论】:

  • 仅包括预加载关联模型使用joins(:configuration_items)
  • 你的 Rails 版本是什么?
  • @matanco - 我尝试使用联接,但转换为 INNER JOIN,因此删除了与 ConfigurationItems 没有任何关联的 ConfigurationKey 条目。我也想包括这些条目:/
  • @itmammoth - 我正在使用 rails 4.2.4

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


【解决方案1】:

在 rails 4.2 中使用 includeswhere 子句会生成 LEFT OUTER JOIN 查询。

请查看rails console中生成的sql。

$ rails c
> ConfigurationKey.includes(:configuration_items).where(name: key_name, configuration_items: { app: [nil, app] })
# Sql is displayed...

你可能会看到LEFT OUTER JOINed sql,如果是这样,那就是正确的。

请注意,您通过 ActiveRecord 获得的结果不等于从 sql 获得的结果。它会从它的 sql 中返回 DISTINCT 结果。

所以,我认为一次查询不可能成功。

【讨论】:

  • 谢谢!我想我会坚持 2 个查询然后.. :/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多