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';

Foi útil?

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 })
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top