2009-08-26 16 views
14

Ich habe eine Kategorie und ein Post-Modell, wobei jeder Beitrag zu einer Kategorie gehört. Bevor ich einen Beitrag erstelle oder aktualisiere, muss ich prüfen, ob die ausgewählte Kategorie existiert. Was ist der beste Weg, um diese Informationen zu validieren?Schienen: Validierung der Existenz einer Assoziation

Im Moment mache ich einen Fund in der Steuerung, um sicherzustellen, dass die Kategorie existiert. Ist es möglich, diese Art von Validierungen in das Modell aufzunehmen?

Antwort

14

http://blog.hasmanythrough.com/2007/7/14/validate-your-existence

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates_presence_of :category 
end 

-ODER-

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates :category, presence: => true 
end 

Rails-Versionen vor 3.2:

class Post < ActiveRecord::Base 
    belongs_to :category 
    validates_existence_of :category 
end 
+0

Funktioniert das, wenn die Kategorie einen Bereich hat? Sagen Sie, dass die Kategorie zu einem Blog gehört. Der Benutzer sollte nur die Kategorien auswählen können, die zu dem Blog gehören. – Homar

+0

@Homar Ich bin mir nicht sicher, was das Scoping betrifft. Wenn die assignes_to-Assoziation diese Einschränkung enthält, würde ich annehmen, dass es funktioniert. –

+0

Dies wurde umbenannt in validates_presence_of in neueren Schienen Versionen – Fa11enAngel

5

Ich habe das in meinem Modell setzen:

validate :ensure_category_exists 

    def ensure_category_exists 
    errors.add('Category') unless self.blog.categories.find_by_id(self.category_id) 
    end 

Der Ausdruck "Kategorie ist ungültig", wenn die Kategorie für den übergeordneten Blog nicht existiert.

-1

In Schienen 3, validates_associated ist wahrscheinlich das, was Sie suchen? http://guides.rubyonrails.org/active_record_validations_callbacks.html#validates_associated

+2

'validates_associated' führt die Validierungen für das zugeordnete Modell aus und schlägt das Hauptmodell fehl, wenn die Verknüpfung ungültig ist. Es würde also die Existenz bestätigen, hat aber zusätzliches Verhalten, das das OP vielleicht haben möchte oder auch nicht. – Woahdae

+3

Ich habe das getestet und 'validates_associated' bricht nicht, wenn das zugehörige Modell nicht existiert (wie zu erwarten). Ich schätze, wenn es nur fehlschlägt, wenn das zugehörige Modell existiert, hat es Validierungen, und mindestens eine von ihnen schlägt fehl. – hsribei

+0

Wie obvio171 sagte, validates_associated validiert NICHT die Existenz der Assoziation. – hrdwdmrbl

20

In Rails 3.2 wird validates_existence_of durch validates_presence_of ersetzt.

+4

auch möglich ist 'validates: category,: presentation => true' –

1

In meinem Weg, um eine bessere Wahl zu denken, ist dieses Juwel: https://github.com/perfectline/validates_existence

Es bestätigt die Existenz der verwandten Modells in der Datenbank. Stellen Sie sich vor, Sie haben ein Dropdown-Feld, das einige Daten zurückgibt, selbst wenn Sie nichts auswählen (standardmäßig nicht ausgewählte erste Feldbezeichnung als Wert). Das Überprüfen der Anwesenheit wird nicht funktionieren, da es für vorhandene Daten bestehen wird. Aber wir wollen eine Art von Constraint und diese DB-Side-Check ist, was das Problem löst.

Verwandte Themen