9

Ist es möglich, die Eindeutigkeit eines Attributs eines Kindmodells gegen eine polymorphe Beziehung zu validieren?Schienen AR validates_uniqueness_of gegen polymorphe Beziehung

Zum Beispiel habe ich ein Modell namens field, die fieldable gehört:

class Field < ActiveRecord::Base 
    belongs_to :fieldable, :polymorphic => :true 
    validates_uniqueness_of :name, :scope => :fieldable_id 
end 

Ich habe mehrere andere Modelle (Pages, Items), die viele Felder haben. Ich möchte also die Eindeutigkeit des Feldnamens gegenüber dem übergeordneten Modell überprüfen, aber das Problem besteht darin, dass gelegentlich eine Page und ein Element dieselbe ID-Nummer haben, was dazu führt, dass die Validierungen fehlschlagen, wenn dies nicht der Fall ist.

Mache ich das nur falsch oder gibt es einen besseren Weg?

Antwort

20

Erweitern Sie einfach den Umfang der fieldable Typ umfassen:

class Field < ActiveRecord::Base 
    belongs_to :fieldable, :polymorphic => :true 
    validates_uniqueness_of :name, :scope => [:fieldable_id, :fieldable_type] 
end 
+1

Vielen Dank. Einfach wenn du weißt wie :) – aaronrussell

0

Sie auch eine Nachricht hinzufügen können die Standardnachricht außer Kraft zu setzen, oder Umfang nutzen die Validierung hinzuzufügen:

class Field < ActiveRecord::Base 
    belongs_to :fieldable, :polymorphic => :true 
    validates_uniqueness_of :fieldable_id, :scope => [:fieldable_id, :fieldable_type], :message => 'cannot be duplicated' 
end 

Als bonus, wenn Sie zu Ihrem en.yml gehen, und geben Sie ein:

activerecord: 
    attributes: 
    field: 
     fieldable_id: 'Field' 

Sie werden die Standard-Sub ersetzen ject ', dass Schienen zu den Fehlern mit dem einen hinzufügen, den Sie hier spezifizieren. Also anstatt zu sagen: Fieldable Id has been already taken oder so, würde es sagen:

Field cannot be duplicated