2009-11-01 4 views
2
감안할 때

는 모델이 : 나는 기대,searchlogic?

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 

일할 수있는 방법이 있습니까?


P. 내가 workging을 얻을 수 있었다 가장 가까운이었다 :

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

어떤 좋은 보이지 않는다.

답변

1

검색 로직을 개발했습니다. 기본적으로 기존 명명 된 범위와 데이터베이스 열을 사용합니다. 궁극적으로 올바른 열 이름을 사용하여 결과 SQL을 작성해야하기 때문에 실제로 그 이상을 수행 할 수는 없습니다. 즉, searchlogic이 title : 속성이 의미하는 바를 깔끔하게 이해할 방법은 없습니다. 그렇게해도 번역 라이브러리에 정의 된 논리에만 해당됩니다. 이것은 라이브러리 자체에 있으면 안되는 붉은 깃발이 아니라 앱 내에서 초기화되는 플러그인 또는 코드입니다.

method_missing 메서드를 재정 의하여 직접 매핑하지 않는 이유는 무엇입니까? (이 안된)

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

여기에 빠른 찌르기입니다 : Searchlogic가 제공하고 alias_scope에 의해 범위 별명 쉬운 방법은 도움이

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"를 절대 입력해서는 안되며, 모델 수준에서 투명하게 처리해야합니다.

관련 문제