Фильтрация Присоединяйтесь к таблице в HAS_MANY: через ROR

StackOverflow https://stackoverflow.com/questions/2171098

  •  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 })
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top