Implementierung eines activerecord vor_find
-
03-07-2019 - |
Frage
Ich baue eine Suche mit den in einer Tabelle zwischengespeicherten Schlüsselwörtern auf. Bevor ein Schlüsselwort mit dem Benutzer in Eingabe in der Tabelle nachgeschaut wird, wird es normalisiert. Beispielsweise wird eine Interpunktion wie '-' entfernt und das Gehäuse standardisiert. Das normalisierte Schlüsselwort wird dann verwendet, um die Suchergebnisse abzurufen.
Ich beauftrage derzeit die Normalisierung im Controller mit einem vornilter. Ich habe mich gefragt, ob es stattdessen eine Möglichkeit gab, dies im Modell zu tun. Etwas konzeptionell wie ein "vor_find" -Callback würde funktionieren, obwohl dies für eine Instanzebene keinen Sinn ergeben würde.
Lösung
Sie sollten benannte Scopes verwenden:
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
Mit den genannten Scopes können Sie mit anderen Scopes anketten, und ist wirklich der richtige Weg, um Rails 3 zu verwenden.
Andere Tipps
Sie möchten dies wahrscheinlich nicht implementieren, indem Sie den Fund überschreiben. Das Überschreiben von etwas wie Find wird wahrscheinlich Kopfschmerzen auf der Leitung sein.
Sie können eine Klassenmethode erstellen, die das tut, was Sie brauchen, so etwas wie:
class MyTable < ActiveRecord::Base
def self.find_using_dirty_keywords(*args)
#Cleanup input
#Call to actual find
end
end
Wenn du Ja wirklich Ich möchte überlasten, dass Sie es auf diese Weise tun können:
Als Beispiel:
class MyTable < ActiveRecord::Base
def self.find(*args)
#work your magic here
super(args,you,want,to,pass)
end
end
Weitere Informationen zur Unterklasse -Kasse für diesen Link: Ruby -Tipps
Ähnlich wie oben können Sie auch eine verwenden 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