Rails可选关联查询

时间:2015-11-02 17:39:44

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

我一直试图解决这个问题一段时间没有成功:(

我有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

我想在一个查询中获取具有特定“name”属性的所有ConfigurationKeys以及其关联的ConfigurationItems的过滤子集。

我使用了以下命令:

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

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

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

有没有可行的方法,或者我必须使用2个查询 - 一个用于获取所有相关的ConfigurationKeys,另一个用于获取所有相关的ConfigurationItems?

谢谢;)

1 个答案:

答案 0 :(得分:0)

在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 JOIN ed sql,如果是的话,它是正确的。

请注意,通过ActiveRecord获得的内容不等于sql的结果。它从sql返回DISTINCT个结果。

所以,我认为在一个查询中取得成功是不可能的。