7 Stimmen

die Erstellung von mehreren Objekten einer Klasse blockieren

Wie beschränke ich das Objekt einer Klasse auf eine. Meine Klasse sieht aus wie :

class Speaker
  include Mongoid::Document
  field :name, :type => String
end

Ich möchte nur eine einzige Instanz von Lautsprecher . Eine Möglichkeit wäre, eine Validierung hinzuzufügen, die die Anzahl der bereits vorhandenen Objekte der Klasse Speaker überprüfen würde. Gibt es eine Ruby-Weise, etwas zu tun?

10voto

Frank Schmitt Punkte 28856

Wie wäre es mit der Verwendung des Singleton Modul?

8voto

Sławosz Punkte 10737

In diesem Fall würde ich eine angemessene Validierung schreiben:

validate :only_one

def only_one
   errors.add(:base, "Only one Speaker can exist") if self.count > 0 
end

3voto

Jeremy Weathers Punkte 2525

Ich empfehle die Verwendung einer Klasse/eines Moduls, das auf die Speicherung von Konfigurationswerten zugeschnitten ist, anstatt Ihre eigenen Werte auf einem ActiveRecord-Modell zu speichern.

Ich verwende eine alte Kopie des Schienen-Einstellungen Plugin mit einigen benutzerdefinierten Änderungen (es funktioniert immer noch sehr gut in Rails 3). Es gibt auch eine Reihe von Varianten, die auf Github aufgelistet sind, also schauen Sie sich ruhig um und suchen Sie sich Ihre Variante aus.

3voto

Steven Soroka Punkte 18749

Warum nicht ein Standard-Sprecherobjekt bereitstellen und einfach keine Controller-Aktionen für das Erstellen oder Löschen anbieten?

Das scheint bei weitem die einfachste Lösung zu sein.

3voto

Alec Wenzowski Punkte 3822

Ich sehe, Sie verwenden Mongoide

Die von Ihnen angeforderte Funktionalität ist nicht verfügbar mit Mongoid-Validierungen .

Daher müssen Sie Ihren eigenen Text verfassen. before_validation es un unterstützter Rückruf und angekettet Speaker.all.count Methoden sind für Ihr Modell verfügbar .

class Speaker
  include Mongoid::Document
  field :name, :type => String
  before_validation(:ensure_has_only_one_record, :on => :create)
  def ensure_has_only_one_record
    self.errors.add :base, "There can only be one Speaker." if Speaker.all.count > 0
  end
end

Allerdings ist die Am besten ist es, alle Schlüssel/Wert-Einstellungen in einer einzigen Tabelle zu speichern. .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X