4

我有以下模型,在这些模型中,我使用 Rails has_many :through 范式通过 Translation 表加入 Language 和 Products 表:

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';

4

2 回答 2

3

你需要一些东西:

product = Product.find(4)
translation = product.translations.find(:first,:joins=>:languages, :conditions=>{:language=>{:lang_code=>'en'}})

该代码将生成 Translations 与 Languages 的连接,并相应地过滤您的 lang_code。

如果括号让您有些困惑(我知道有时会这样做),您也可以执行以下操作:

translation = product.translations.find(:first,:joins=>:languages, :conditions=>["languages.lang_code like ?",'en'])

最后一点应该产生相同的 SQL 查询,将 Translations 与 Language 连接起来,然后通过它的 lang_code 进行过滤。

于 2010-01-31T19:34:32.680 回答
0

Yaraher 的回答有效,尽管我找到了一种更简单的方法来完成同样的事情:

t = Translation.find(:first, 
                     :conditions => { :product_id => prod.id, 
                                      :language_id => lang.id })
于 2010-01-31T19:53:18.663 回答