Filtrage table de jointure dans has_many: par en RoR
-
24-09-2019 - |
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';
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 })