2016-07-28 32 views
1

Ich habe die Sinne und Übersetzungen des Wortes in verschiedenen Sprachen, hier ist Schema http://sqlfiddle.com/#!15/cba5e/2 Ich brauche alle Sinne und nur Spanien Übersetzungen (Code "es"), so abfragen sollte so aussehen:Eager loaing mit LINKS OUTER JOIN und mehrere Bedingungen in der ON-Klausel

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

Kann ich es mit eager_load/includes/.. tun?

-Code wie

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

nicht funktioniert, weil es Bedingungen in der WHERE-Klausel angeben und erzeugen Abfrage wie

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

und ich nur mit "es" Übersetzungen abtastet. Aber ich brauche alle Sinne + Übersetzungen Spanien, sehen Sie den Unterschied: http://sqlfiddle.com/#!15/cba5e/2 und http://sqlfiddle.com/#!15/cba5e/3

Von https://www.postgresql.org/docs/current/static/queries-table-expressions.html: Einschränkung in der Klausel verarbeitet ON gestellt vor die Verbindung, während eine Beschränkung in der platziert WHERE-Klausel verarbeitet wird nach verbinden die

+0

Ich habe die Antwort unten beantwortet, bitte nehmen Sie sich Zeit, um es zu bewerten – bLaXjack

Antwort

0

Diese

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

tun includes does LEFT OUTER JOIN

+0

Es gibt bereits eine exakt gleiche Antwort auf diese Frage. –

+0

Nun, ich schrieb die Antwort und machte einige andere Arbeit, die nicht bedeutet, dass Sie es downvote –

+0

Da dies ein Duplikat und später Antwort ist, gibt es keinen Nutzen für sie anders als auf dieser Seite statt. Es sollte deutlich als solches gekennzeichnet sein, und das ist der Weg, dies zu tun. Jeder kann eine doppelte Antwort posten, aber anstatt sie zu behalten, sollte man stattdessen die frühere Antwort aufwerten. –

0

Einen Weg gefunden, die eifrige Belastung mit linker äußerer Verbindung zu erfüllen. es wird durch Verwendung der Assoziation mit der Bedingung gemacht.

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) 

mit diesem wird es einen linken äußeren Join mit Bedingung für die ON-Abfrage erstellen.