Вопрос

Я строю поиск с ключевыми словами, кэшированными в таблице.Прежде чем введенное пользователем ключевое слово будет найдено в таблице, оно нормализуется.Например, некоторые знаки препинания, такие как «-», удалены, а регистр стандартизирован.Затем нормализованное ключевое слово используется для получения результатов поиска.

В настоящее время я занимаюсь нормализацией в контроллере с помощью 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.Переопределение чего-то вроде 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top