过滤has_many中的连接表:通过RoR

时间:2010-01-31 08:54:49

标签: ruby-on-rails has-many-through

我有以下模型,我使用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';

2 个答案:

答案 0 :(得分:3)

你需要这样的东西:

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

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

如果括号让你感到困惑(我知道有时会这样做),你也可以这样做:

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

最后一位应生成相同的SQL查询,将Translations与Language连接,然后通过它的lang_code进行过滤。

答案 1 :(得分:0)

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

t = Translation.find(:first, 
                     :conditions => { :product_id => prod.id, 
                                      :language_id => lang.id })