سؤال

لدي النماذج التالية في الانضمام إلى اللغة الجدول المنتجات عبر الترجمة الجدول باستخدام القضبان 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 })
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top