我有不同语言的感官和翻译,这里是架构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/2和http://sqlfiddle.com/#!15/cba5e/3
来自https://www.postgresql.org/docs/current/static/queries-table-expressions.html: 放置在ON子句中的限制在之前处理加入,而WHERE子句中的限制在之后处理
答案 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