在查找之前实现ActiveRecord

在查找之前实现ActiveRecord,activerecord,callback,Activerecord,Callback,我正在使用缓存在表中的关键字构建搜索。在表中查找用户输入的关键字之前,它是标准化的。例如,删除了一些标点符号,如“-”,并对外壳进行了标准化。然后使用规范化关键字查找和获取搜索结果 我目前正在使用before_过滤器在控制器中处理规范化。我想知道是否有办法在模型中实现这一点。概念上类似于“before_find”回调的方法可以工作,尽管对于实例级别来说没有意义 您可能不想通过覆盖find来实现这一点。覆盖像find这样的东西可能会让人头疼 您可以创建一个类方法来完成您需要的工作,例如: clas

我正在使用缓存在表中的关键字构建搜索。在表中查找用户输入的关键字之前,它是标准化的。例如,删除了一些标点符号,如“-”,并对外壳进行了标准化。然后使用规范化关键字查找和获取搜索结果


我目前正在使用before_过滤器在控制器中处理规范化。我想知道是否有办法在模型中实现这一点。概念上类似于“before_find”回调的方法可以工作,尽管对于实例级别来说没有意义

您可能不想通过覆盖find来实现这一点。覆盖像find这样的东西可能会让人头疼

您可以创建一个类方法来完成您需要的工作,例如:

class MyTable < ActiveRecord::Base
  def self.find_using_dirty_keywords(*args)
    #Cleanup input
    #Call to actual find
  end
end
classmytable
如果你真的想找到超负荷,你可以这样做:

例如:

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

有关子类化签出的详细信息,请访问此链接:

与上述内容类似,您也可以使用
alias\u方法\u链

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
classyourmodel类您应该使用命名作用域:

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
class which{:关键字=>规范化_关键字(关键字)}}
定义自我规范化_关键字(关键字)
#在这里施展你的魔法
结束
结束
使用命名作用域将允许您与其他作用域进行链接,这确实是使用Rails3的方法