9

¿Es posible validar la unicidad del atributo de un modelo secundario con una relación polimórfica?Rails AR validates_uniqueness_of contra la relación polimórfica

Por ejemplo, tengo un modelo llamado field que pertenece a fieldable:

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

Tengo varios otros modelos (páginas, elementos) que tienen muchos campos. Entonces, lo que quiero es validar la singularidad del nombre de campo con respecto al modelo principal, pero el problema es que ocasionalmente una Página y un Artículo comparten el mismo número de ID, lo que hace que las validaciones fallen cuando no deberían.

¿Acabo de hacer esto mal o hay una mejor manera de hacerlo?

Respuesta

20

Sólo ampliar el alcance para incluir el tipo fieldable:

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

Gracias. Simples cuando sabes cómo :) – aaronrussell

0

También puede agregar un mensaje para anular el mensaje predeterminado o utilice alcance para agregar la validación:

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

Como bono si va a su en.yml, e ingrese:

activerecord: 
    attributes: 
    field: 
     fieldable_id: 'Field' 

Va a reemplazar el 'sub por defecto ject 'que los rieles añaden a los errores con el que especifique aquí. Entonces en vez de decir: Fieldable Id has been already taken más o menos, diría:

Field cannot be duplicated 
Cuestiones relacionadas