Filtering Join-Tabelle in has_many: durch in RoR
-
24-09-2019 - |
Frage
Ich habe die folgenden Modelle, in denen ich an dieser Sprache und Produkten Tabelle über die Übersetzungstabelle der Rails has_many mit: durch Paradigma:
class Language < ActiveRecord::Base
has_many :translations
has_many :products, :through => :translations
end
class Translation < ActiveRecord::Base
belongs_to :product
belongs_to :language
end
class Product < ActiveRecord::Basehas_many :translations
has_many :translations
has_many :languages, :through => :translations
end
Ich mag die englische Übersetzung für ein bestimmtes Produkt zu finden.
kann ich Liste die zugehörigen Sprachen und Übersetzungen:
prod = Product.find(4)
en = Language.find(:first, :conditions => { :lang_code => 'en' })
puts prod.translations
puts prod.languages
Diese Ausgabe:
#<Translation:0x11022a4>
#<Translation:0x1102114>
#<Language:0x602070>
#<Language:0x602020>
(Es gibt ein Englisch und Französisch Übersetzung für dieses Produkt.)
Wie kann ich die Übersetzung für prod
zum en
entsprechenden bekommen Sprache?
Wenn das nicht Sinn machen, hier ist das Äquivalent SQL:
SELECT t.* FROM products p, translations t, languages l WHERE l.id = t.language_id AND p.id = t.product_id AND l.lang_code = 'en';
Lösung
Sie würden etwas in diese brauchen:
product = Product.find(4)
translation = product.translations.find(:first,:joins=>:languages, :conditions=>{:language=>{:lang_code=>'en'}})
Der Code wird produziert eine Verknüpfung von Übersetzungen mit Sprachen und Filter entsprechend Ihrer lang_code.
Wenn die Klammern verwechseln Sie etwas (ich weiß, manchmal tun sie) Sie auch so etwas tun könnte:
translation = product.translations.find(:first,:joins=>:languages, :conditions=>["languages.lang_code like ?",'en'])
Das letzte Bit die gleiche SQL-Abfrage erzeugen sollte, Übersetzungen mit Sprache verbindet und dann durch die lang_code es gefiltert wird.
Andere Tipps
Yaraher Antwort funktioniert, obwohl ich einen einfacheren Weg gefunden, das Gleiche zu erreichen:
t = Translation.find(:first,
:conditions => { :product_id => prod.id,
:language_id => lang.id })