在before_find之前实现ActiveRecord

时间:2009-04-29 17:59:53

标签: activerecord callback

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

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

3 个答案:

答案 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