Фильтрация Присоединяйтесь к таблице в HAS_MANY: через ROR
-
24-09-2019 - |
Вопрос
У меня есть следующие модели, в которых я присоединяюсь к таблице языка и продуктов через таблицу перевода, используя Rails 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.
Другие советы
Ответ Яараера работает, хотя я нашел более простой способ выполнить то же самое:
t = Translation.find(:first,
:conditions => { :product_id => prod.id,
:language_id => lang.id })