[英]searchlogic with globalize2?
給定一個模型:
class MenuItem < ActiveRecord::Base
translates :title
end
並且插入了searchlogic,我希望以下方法能夠正常工作:
>> 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')
哪個看起來不太好。
我開發了searchlogic。 默認情況下,它利用現有的命名作用域和數據庫列。 它實際上不能超出范圍,因為最終它必須使用有效的列名來創建結果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”,這應該在模型級別上透明地進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.