Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 搜索逻辑与全球化2?_Ruby On Rails_Searchlogic - Fatal编程技术网

Ruby on rails 搜索逻辑与全球化2?

Ruby on rails 搜索逻辑与全球化2?,ruby-on-rails,searchlogic,Ruby On Rails,Searchlogic,有一个模型: class MenuItem < ActiveRecord::Base translates :title end 遗憾的是,它没有: Searchlogic::Search::UnknownConditionError: The title_like is not a valid condition. You may only use conditions that map to a named scope 有没有办法使工作顺利进行 附言。 我最接近的工作是: &

有一个模型:

class MenuItem < ActiveRecord::Base
  translates :title
end
遗憾的是,它没有:

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')

看起来不太好

我开发了搜索逻辑。默认情况下,它利用现有的命名作用域和数据库列。它实际上不能超越这一点,因为最终它必须使用有效的列名创建结果SQL。也就是说,searchlogic确实无法清楚地理解:title属性的含义。即使有,它也会特定于您的翻译库中定义的逻辑。这是一个红旗,表明它不应该在库中,而是在应用程序中初始化的插件或代码

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

alias_scope :title_like, lambda { |value| globalize_translations_title_like(value) }
这里有一个快速的尝试(这是未经测试的):

希望有帮助。再说一次,我还没有测试代码,但是您应该了解总体思路。但是我同意,翻译的实现应该在幕后进行,你真的不应该在你的应用程序的任何地方键入“globalize_translations”,这应该在模型级别上透明地处理

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)