我正在使用表格中缓存的关键字构建搜索。在表中查找用户输入的关键字之前,将其标准化。例如,删除了一些像“ - ”这样的标点符号,并且外壳是标准化的。然后使用规范化关键字来查找获取搜索结果。
我目前正在使用before_filter处理控制器中的规范化。我想知道是否有一种方法可以在模型中做到这一点。在概念上类似于“before_find”回调的东西可以工作,尽管这对于实例级别没有意义。
答案 0 :(得分: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
使用命名范围将允许您与其他范围链接,并且实际上是使用Rails 3的方式。
答案 1 :(得分:0)
您可能不希望通过覆盖查找来实现此目的。覆盖像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
有关子类化结帐的详细信息,请参阅此链接:Ruby Tips
答案 2 :(得分: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