Реализация ActiveRecord before_find
-
03-07-2019 - |
Вопрос
Я строю поиск с ключевыми словами, кэшированными в таблице.Прежде чем введенное пользователем ключевое слово будет найдено в таблице, оно нормализуется.Например, некоторые знаки препинания, такие как «-», удалены, а регистр стандартизирован.Затем нормализованное ключевое слово используется для получения результатов поиска.
В настоящее время я занимаюсь нормализацией в контроллере с помощью 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