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

È stato utile?

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 })
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top