2009-04-29 3 views
3

테이블에 캐시 된 키워드로 검색을 구축 중입니다. 사용자 입력 키워드가 표에서 조회되기 전에 정규화됩니다. 예를 들어 '-'와 같은 구두점이 제거되고 케이스가 표준화됩니다. 그런 다음 정규화 된 키워드를 사용하여 검색 결과를 가져옵니다.ActiveRecord 구현 before_find

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

답변

2

당신해야한다라는 이름의 범위를 사용하고있을 : 다른 범위와 체인을 허용라는 이름의 범위를 사용

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.

를 사용하여 길을 가야하는 것입니다
0

find를 재정 의하여 구현하지 않을 수도 있습니다. find와 같은 것을 무시하면 아마도 두통이 될 것입니다. 예를 들어

: 당신이 정말 당신이 그것을 이런 식으로 작업을 수행 할 수 있습니다 찾을 과부하하려면

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

:

당신은, 그러나 뭔가를 필요 않는 클래스 메소드를 만들 수 있습니다 Ruby Tips

: 서브 클래 싱 체크 아웃에 대한 추가 정보를 원하시면이 링크를 들어

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

0

위와 매우 유사하므로 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