문제

테이블에 캐시 된 키워드로 검색을 구축하고 있습니다. 사용자 입력 된 키워드가 테이블에서 찾아보기 전에 정규화됩니다. 예를 들어, '-'와 같은 일부 구두점이 제거되고 케이싱이 표준화됩니다. 그런 다음 정규화 된 키워드를 사용하여 검색 결과를 찾는 데 사용됩니다.

현재 컨트롤러의 정규화를 prever_filter로 처리하고 있습니다. 대신 모델 에서이 작업을 수행 할 방법이 있는지 궁금합니다. 인스턴스 수준에서는 의미가 없지만 개념적으로 "prever_find"콜백과 같은 것이 작동합니다.

도움이 되었습니까?

해결책

이름이 지정된 스코프를 사용해야합니다.

class Whatever < ActiveRecord::Base

  named_scope :search, lambda {|*keywords|
    {:conditions => {:keyword => normalize_keywords(keywords)}}}

  def self.normalize_keywords(keywords)
    # Work your magic here
  end

end

이름이 지정된 스코프를 사용하면 다른 스코프로 체인 할 수 있으며 실제로 레일 3을 사용하는 방법입니다.

다른 팁

당신은 아마도 찾기를 재정의하여 이것을 구현하고 싶지 않을 것입니다. Find와 같은 것을 무시하는 것은 아마도 두통이 될 것입니다.

그러나 필요한 것을 수행하는 클래스 메소드를 만들 수 있습니다.

class MyTable < ActiveRecord::Base
  def self.find_using_dirty_keywords(*args)
    #Cleanup input
    #Call to actual find
  end
end

만약 너라면 진짜 과부하가 발생하여 다음과 같은 방식으로 할 수 있습니다.

예로서:

class MyTable < ActiveRecord::Base
  def self.find(*args)
    #work your magic here
    super(args,you,want,to,pass)
  end
end

서브 클래스 체크 아웃에 대한 자세한 내용은이 링크 : 루비 팁

위와 마찬가지로 alias_method_chain.

class YourModel < ActiveRecord::Base

  class << self
    def find_with_condition_cleansing(*args)
      #modify your args
      find_without_condition_cleansing(*args)
    end
    alias_method_chain :find, :condition_cleansing
  end

end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top