渴望使用LEFT OUTER JOIN和ON子句中的多个条件

时间:2016-07-28 13:24:21

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

我有不同语言的感官和翻译,这里是架构http://sqlfiddle.com/#!15/cba5e/2 我需要获得所有感官和西班牙语翻译(代码" es"),因此查询应该看起来像

SELECT *
FROM senses s 
LEFT OUTER JOIN translations t ON
    s.id = t.sense_id AND t.language_code = 'es';

我可以使用eager_load / includes /..?

来完成

代码

Sense.includes(:translations).where(translations: { language_code: 'es' })

不起作用,因为它在WHERE子句中指定条件并生成类似

的查询
SELECT *
FROM senses s 
LEFT OUTER JOIN translations t ON s.id = t.sense_id
WHERE t.language_code = 'es';

我只能感受" es"翻译。但我需要所有感官+西班牙语翻译,看看区别:http://sqlfiddle.com/#!15/cba5e/2http://sqlfiddle.com/#!15/cba5e/3

来自https://www.postgresql.org/docs/current/static/queries-table-expressions.html: 放置在ON子句中的限制在之前处理加入,而WHERE子句中的限制在之后处理

2 个答案:

答案 0 :(得分:1)

找到一种方法来实现左外连接的急切加载。它是通过与条件的关联来完成的。

Sense (model)
has_many es_translations -> { where(language_code: 'es') },
           :class_name => "Translations",
           :foreign_key => "foreign_key_column"

# references is used to ensure eager load
Sense.includes(:es_translations).references(:es_translations) 

使用它,它将在ON查询上创建一个带有条件的左外连接。

答案 1 :(得分:0)

这样做

Sense.includes(:translations).where('translations.language_code = ?', 'es')

includes执行LEFT OUTER JOIN