activerecord prever_find 구현
-
03-07-2019 - |
문제
테이블에 캐시 된 키워드로 검색을 구축하고 있습니다. 사용자 입력 된 키워드가 테이블에서 찾아보기 전에 정규화됩니다. 예를 들어, '-'와 같은 일부 구두점이 제거되고 케이싱이 표준화됩니다. 그런 다음 정규화 된 키워드를 사용하여 검색 결과를 찾는 데 사용됩니다.
현재 컨트롤러의 정규화를 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
제휴하지 않습니다 StackOverflow