Question

Je les modèles suivants dans lesquels je faire partie de la table des langues et des produits via la table de traduction en utilisant des rails has_many: par paradigme:

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

Je veux trouver la langue anglaise de traduction pour un produit particulier.

Je peux énumérer les langues associées et Traductions:

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

puts prod.translations
puts prod.languages

Cette affiche:

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

(Il y a une traduction en anglais et français pour ce produit.)

Comment puis-je obtenir la traduction pour prod correspondant à la langue en?

Si cela n'a pas de sens, voici le SQL équivalent:

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

Était-ce utile?

La solution

Vous auriez besoin de quelque chose le long de ceci:

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

Le code produira une jointure de traductions avec les langues et le filtre en conséquence votre lang_code.

Si les crochets vous confondez un peu (je sais que parfois ils le font), vous pouvez aussi faire quelque chose comme ceci:

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

Ce dernier bit devrait produire la même requête SQL, joindre Traductions avec la langue et le filtrage par sa lang_code.

Autres conseils

La réponse de Yaraher fonctionne, bien que je trouve un moyen plus simple d'accomplir la même chose:

t = Translation.find(:first, 
                     :conditions => { :product_id => prod.id, 
                                      :language_id => lang.id })
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top