【问题标题】:Filtering join table in has_many :through in RoR在 has_many 中过滤连接表:通过 RoR
【发布时间】:2011-01-11 09:10:08
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你需要一些东西:

    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 进行过滤。

    【讨论】:

    • 谢谢,这行得通。我的第二个代码 sn-p 出现错误,直到我将语言设为复数::conditions=>{:languages=>{:lang_code=>'en'}}
    【解决方案2】:

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

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

    【讨论】:

    • 很高兴知道我已经提供了一些帮助!请注意,要使此功能正常工作,您需要知道 Product.id 和 Language.id。如果您已经拥有它们,那么没有问题。如果没有,您需要一个额外的查询来获取 Language.id,在您原来的问题上您只需要一个并将 lang_code 发送给它。
    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多