簡體   English   中英

帶有globalize2的searchlogic?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM