Filtraggio unirsi tavola in has_many: attraverso RoR
-
24-09-2019 - |
Domanda
Ho i seguenti modelli in cui unire la tabella di lingua e prodotti tramite la tabella di conversione utilizzando il has_many Rails: attraverso di 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
Voglio trovare la lingua inglese per un particolare prodotto.
posso elencare l'associato Lingue e Traduzioni:
prod = Product.find(4)
en = Language.find(:first, :conditions => { :lang_code => 'en' })
puts prod.translations
puts prod.languages
Questo stampa:
#<Translation:0x11022a4>
#<Translation:0x1102114>
#<Language:0x602070>
#<Language:0x602020>
(Esiste una traduzione in inglese e francese per questo prodotto.)
Come posso ottenere la traduzione degli prod
corrispondente al en
lingua?
Se questo non ha senso, qui è la SQL equivalente:
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';
Soluzione
Si sarebbe bisogno di qualcosa di lungo questa:
product = Product.find(4)
translation = product.translations.find(:first,:joins=>:languages, :conditions=>{:language=>{:lang_code=>'en'}})
Il codice produrrà un join di traduzioni con Lingue e filtro di conseguenza il vostro LANG_CODE.
Se le staffe si confondono un po '(so che a volte lo fanno) si potrebbe anche fare qualcosa di simile:
translation = product.translations.find(:first,:joins=>:languages, :conditions=>["languages.lang_code like ?",'en'])
Questo ultimo bit dovrebbe produrre la stessa query SQL, unendo Traduzioni con lingua e quindi filtrando da esso di LANG_CODE.
Altri suggerimenti
opere risposta di Yaraher, anche se ho trovato un modo più semplice per ottenere la stessa cosa:
t = Translation.find(:first,
:conditions => { :product_id => prod.id,
:language_id => lang.id })