Tabela de junção de filtragem em has_many: através do ror
-
24-09-2019 - |
Pergunta
Eu tenho os seguintes modelos em que entro na tabela de idiomas e produtos através da tabela de tradução usando o Rails Has_Many: através do 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
Quero encontrar a tradução do idioma inglês para um determinado produto.
Eu posso listar os idiomas e traduções associados:
prod = Product.find(4)
en = Language.find(:first, :conditions => { :lang_code => 'en' })
puts prod.translations
puts prod.languages
Isso impressa:
#<Translation:0x11022a4>
#<Translation:0x1102114>
#<Language:0x602070>
#<Language:0x602020>
(Há uma tradução em inglês e francês para este produto.)
Como posso obter a tradução para prod
correspondente a en
Linguagem?
Se isso não faz sentido, aqui está o 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';
Solução
Você precisaria de algo ao longo disso:
product = Product.find(4)
translation = product.translations.find(:first,:joins=>:languages, :conditions=>{:language=>{:lang_code=>'en'}})
O código produzirá uma junção de traduções com idiomas e filtrará de acordo com o seu LANG_CODE.
Se os colchetes o confundirem um pouco (eu sei que às vezes fazem), você também pode fazer algo assim:
translation = product.translations.find(:first,:joins=>:languages, :conditions=>["languages.lang_code like ?",'en'])
Esse último bit deve produzir a mesma consulta SQL, juntando -se a traduções com o idioma e depois filtrando por seu Lang_code.
Outras dicas
A resposta de Yaraher funciona, embora eu tenha encontrado uma maneira mais simples de realizar a mesma coisa:
t = Translation.find(:first,
:conditions => { :product_id => prod.id,
:language_id => lang.id })