我开发了搜索逻辑。默认情况下,它利用现有的命名范围和数据库列。它不能真正超越这一点,因为最终它必须使用有效的列名创建生成的 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”,这应该在模型级别透明地处理。