【问题标题】:searchlogic with globalize2?使用 globalize2 的搜索逻辑?
【发布时间】:2009-11-01 20:11:33
【问题描述】:

假设有一个模型:

class MenuItem < ActiveRecord::Base
  translates :title
end

并且搜索逻辑已插入,我希望以下工作:

>> MenuItem.search(:title_like => 'tea')

遗憾的是,它没有:

Searchlogic::Search::UnknownConditionError: The title_like is not a valid condition. You may only use conditions that map to a named scope

有没有办法让工作?


附: 我最接近工作的是:

>> MenuItem.search(:globalize_translations_title_like => 'tea')

看起来不太好。

【问题讨论】:

    标签: ruby-on-rails searchlogic


    【解决方案1】:

    我开发了搜索逻辑。默认情况下,它利用现有的命名范围和数据库列。它不能真正超越这一点,因为最终它必须使用有效的列名创建生成的 SQL。也就是说,searchlogic 确实没有办法清楚地理解您的 :title 属性的含义。即使是这样,它也将特定于您的翻译库中定义的逻辑。这是一个危险信号,它不应该在库本身中,而是在您的应用程序中初始化的插件或代码。

    为什么不重写 method_missing 方法并自己进行映射呢? Searchlogic 通过执行 alias_scope 提供了一种简单的别名作用域方法:

    alias_scope :title_like, lambda { |value| globalize_translations_title_like(value) }
    

    这是一个快速的测试(未经测试):

    module TranslationsMapping
      def self.included(klass)
        klass.class_eval do
          extend ClassMethods
        end
      end
    
      module ClassMethods
        protected
          def method_missing(name, *args, &block)
            translation_attributes = ["title"].join("|")
            conditions = (Searchlogic::NamedScopes::Conditions::PRIMARY_CONDITIONS + 
              Searchlogic::NamedScopes::Conditions::ALIAS_CONDITIONS).join("|"))
    
            if name.to_s =~ /^(#{translation_attributes})_(#{conditions})$/
              attribute_name = $1
              condition_name = $2
              alias_scope "#{attribute_name}_#{condition_name}", lambda { |value| send("globalize_translations_#{attribute_name}_#{condition_name}", value) }
              send(name, *args, &block)
            else
              super
            end
          end
       end
    end
    
    ActiveRecord::Base.send(:include, TranslationsMapping)
    

    希望对您有所帮助。同样,我还没有测试过代码,但你应该明白了。但我同意,翻译的实现应该在幕后,你真的不应该在你的应用程序的任何地方输入“globalize_translations”,这应该在模型级别透明地处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      相关资源
      最近更新 更多