2010-04-20 49 views
1

我在我的模型中有一個named_scope,並希望基於區域設置的不同條件。在開發此代碼完美的工作後,切換到生產named_scope不起作用,我每次都得到第一個條件(「德」)。我認爲這是一個緩存問題? 我正在使用2.3.5。和開箱即用的設置。如何在模型named_scope中使用語言環境?

named_scope :public, 
    :conditions => I18n.locale == "de" || I18n.locale == :de ? ["published=? AND trash=?", true, false] : ["published_#{I18n.locale} =? AND trash=?", true, false] 

回答

1

是的,這是類緩存rails的「問題」。在生產中,類被加載並被緩存,因爲在類上下文中評估條件,當類加載時,這應該是I18n.locale的值。

爲了解決這個問題,你可以簡單地把它關掉通過設置

config.cache_classes = false 
在「配置/ enviroments/production.yml」

,但是這會減慢響應時間。

一個更好的解決辦法是使用lambda,並通過在區域

named_scope :public, lambda {|l| 
    if l == :de or l == 'de' 
    {:conditions => ["published=? AND trash=?", true, false]} 
    else 
    {:conditions => ["published_#{l} =? AND trash=?", true, false]} 
    end 
} 

然後你可以使用它像這樣:

Article.public(I18n.locale) 
2

上課期間爲conditions選項的值進行評估加載。在開發模式下,每個請求都會加載類。因此,您的代碼在開發模式下工作。

named_scope :published, lambda { |*args| { 
       name = "_de" if (args.first||"").to_s == 'de' 
       :conditions => ["published#{name} =? AND trash=?", true, false] 
       } 
       } 

您可以將拉姆達如下:

Post.published # no locale passed 
Post.published(locale) # with locale passed 

使用參數化拉姆達創建命名範圍

相關問題