Реализация ActiveRecord before_find - PullRequest
3 голосов
/ 29 апреля 2009

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

В настоящее время я занимаюсь нормализацией в контроллере с помощью before_filter. Мне было интересно, есть ли способ сделать это в модели вместо этого. Что-то концептуально, как обратный вызов before_find, будет работать, хотя это не имеет смысла для уровня экземпляра.

Ответы [ 3 ]

2 голосов
/ 10 июня 2010

Вы должны использовать именованные области:

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.

0 голосов
/ 09 июня 2009

так же, как и выше, вы также можете использовать 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
0 голосов
/ 29 апреля 2009

Вы, вероятно, не хотите реализовывать это путем переопределения 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

Для получения дополнительной информации о проверке подклассов эта ссылка: Ruby Tips

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...