Как я могу использовать локали в модели named_scope? - PullRequest
1 голос
/ 20 апреля 2010

У меня есть named_scope в моей модели, и я хочу другое условие в зависимости от локали.При разработке этот код работает отлично, после перехода к производству named_scope не работает, и я получаю каждый раз первое условие («de»).Я думаю, что это проблема кеширования?Я работаю с 2.3.5.и настройки env из коробки.

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

Ответы [ 2 ]

2 голосов
/ 20 апреля 2010

Значение параметра 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
1 голос
/ 20 апреля 2010

Да, это «проблема» с классом кэширования рельсов. В производстве класс загружается, а затем кэшируется, поскольку условие оценивается в контексте класса, это должно быть значение I18n.locale, когда класс был загружен.

Чтобы решить проблему, вы можете просто отключить ее, установив

config.cache_classes = false

в вашем config / enviroments / production.yml, но это замедляет время отклика.

Лучшим решением было бы использовать лямбду и передать в локаль

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...