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

我目前正在使用before_filter处理控制器中的规范化。我想知道是否有一种方法可以在模型中做到这一点。概念上类似于“before_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

使用命名范围将允许您与其他范围链接,并且实际上是使用Rails 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

有关子类化结帐此链接的更多信息: Ruby Tips

与上述类似,您也可以使用 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top