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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top