Pregunta

He los siguientes modelos en los que me uno a la tabla de idiomas y los productos a través de la tabla de traducción mediante el has_many Carriles: a través de 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

Quiero encontrar la traducción en Inglés de un producto en particular.

Me puede enumerar el asociado Idiomas y Traducciones:

prod = Product.find(4)
en = Language.find(:first, :conditions => { :lang_code => 'en' })

puts prod.translations
puts prod.languages

Esta impresora:

#<Translation:0x11022a4>
#<Translation:0x1102114>
#<Language:0x602070>
#<Language:0x602020>

(Hay una traducción al Inglés y Francés para este producto.)

¿Cómo puedo obtener la traducción de prod correspondiente al en idioma?

Si eso no tiene sentido, aquí es el equivalente 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';

¿Fue útil?

Solución

Se necesitaría algo en esto:

product = Product.find(4)
translation = product.translations.find(:first,:joins=>:languages, :conditions=>{:language=>{:lang_code=>'en'}})

El código producirá una unión de Traducciones Idiomas con filtro y por consiguiente su LANG_CODE.

Si los soportes se confunden un poco (sé que a veces lo hacen) también se podría hacer algo como esto:

translation = product.translations.find(:first,:joins=>:languages, :conditions=>["languages.lang_code like ?",'en'])

Esto último se debe producir la misma consulta SQL, uniéndose Traducciones con el lenguaje y luego filtrar por él es código_idioma.

Otros consejos

Fábrica de la respuesta de Yaraher, aunque he encontrado una manera más sencilla de obtener el mismo resultado:

t = Translation.find(:first, 
                     :conditions => { :product_id => prod.id, 
                                      :language_id => lang.id })
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top