2013-09-18 2 views
0

У меня есть модель пользователя, которая имеет полиморфные отношения с учителями, учениками и администратором. Эти три типа пользователей относятся к школе. Я хотел бы иметь его так, чтобы имя пользователя было уникальным в школе. Как я могу написать подтверждения для этого?проверить уникальность поля в области

Вот что мои модели выглядит следующим образом:

class User < ActiveRecord::Base 
    belongs_to :profileable, :polymorphic => true 
    delegate :school, :to => :profileable 
end 

class Student < ActiveRecord::Base 
    belongs_to :school 
    has_one :user, :as => :profileable 
    delegate :name, :username, :to => :user 
end 

class Teacher < ActiveRecord::Base 
    belongs_to :school 
    has_one :user, :as => :profileable 
    delegate :name, :username, :to => :user 
end 

class Admin < ActiveRecord::Base 
    belongs_to :school 
    has_one :user, :as => :profileable 
    delegate :name, :username, :to => :user 
end 
+0

Вы пробовали обычную 'validates_uniqueness_of: username' в своей модели пользователя? Остальные классы только связывают их. – KappaNossi

+0

Да, но это не совсем то, что я ищу. Я хочу, чтобы имя пользователя было уникальным в школе. Таким образом, пользователь в одной школе может иметь то же имя пользователя, что и пользователь в другой школе. – dhouty

ответ

1

Я совершенно уверен, что вам нужно будет использовать пользовательский валидатор для этого. Делегированный атрибут не будет использоваться в модели пользователя. То, что вы можете сделать, также включает в себя метод school_id в методе «Пользователь» и устанавливать его с помощью before_validate каждый раз. Тогда вы сможете использовать «простой» уникальность валидатора:

validates :username, :uniqueness => {:scope => :school_id} 

Однако валидатор присоединение к school_id от profileable родителя, вероятно, будет более чистым путем.

Смежные вопросы