تصفية الانضمام إلى الجدول في has_many :خلال RoR
-
24-09-2019 - |
سؤال
لدي النماذج التالية في الانضمام إلى اللغة الجدول المنتجات عبر الترجمة الجدول باستخدام القضبان has_many :من خلال النموذج:
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
أريد أن أجد اللغة الإنجليزية والترجمة لمنتج معين.
أستطيع أن القائمة المرتبطة اللغات و الترجمات:
prod = Product.find(4)
en = Language.find(:first, :conditions => { :lang_code => 'en' })
puts prod.translations
puts prod.languages
هذه المطبوعات:
#<Translation:0x11022a4>
#<Translation:0x1102114>
#<Language:0x602070>
#<Language:0x602020>
(هناك الإنجليزية و الترجمة الفرنسية لهذا المنتج.)
كيف يمكنني الحصول على الترجمة prod
المقابلة en
اللغة ؟
إذا كان هذا لا معنى له, هنا هو ما يعادل 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';
المحلول
كنت بحاجة الى شيء على طول هذا:
product = Product.find(4)
translation = product.translations.find(:first,:joins=>:languages, :conditions=>{:language=>{:lang_code=>'en'}})
رمز سوف تنتج الانضمام إلى الترجمات مع لغات تصفية وعليه الخاص بك lang_code.
إذا كان بين قوسين نخلط قليلا (وأنا أعلم أحيانا يفعلون) أيضا يمكن أن تفعل شيئا مثل هذا:
translation = product.translations.find(:first,:joins=>:languages, :conditions=>["languages.lang_code like ?",'en'])
هذا الجزء الأخير يجب أن تنتج نفس استعلام SQL, الانضمام الترجمة مع اللغة ومن ثم تصفية من قبل انها lang_code.
نصائح أخرى
Yaraher الجواب يعمل, على الرغم من أنني وجدت أبسط طريقة لتحقيق نفس الشيء:
t = Translation.find(:first,
:conditions => { :product_id => prod.id,
:language_id => lang.id })