2015-05-22 93 views
1

我有一个has_many通过:TokenUser之间的关联使用UserToken作为连接模型。我希望将Token模型的device_name属性上的validate_uniqueness_of作用域限定为特定的用户。有很多通过关联的范围验证

意思是,如果已经为该用户使用相同的device_name创建了一个令牌记录,我只想验证device_name的唯一性。通常人们可以这样做:validates_uniqueness_of :device_name, scope: :user_id但是user_id不是Token的属性,这个属性在连接表中......我很难弄清楚如何在Rails中创建这个验证。我知道你可以在数据库级别使用索引,但如果可能的话,我想通过验证来完成。有什么想法吗?

class Token < ActiveRecord::Base 
    has_many :user_tokens 
    has_many :users, through: :user_tokens 

    validates_uniqueness_of :device_name, scope: #only validate if there is already a Token for this user with this device_name. 
end 

class User < ActiveRecord::Base 
    has_many :user_tokens 
    has_many :tokens, through: :user_tokens 
end 

class UserToken < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :token 
end 

回答

1

我能够通过创建以下自定义验证来实现我想要的效果。

validate :unique_device_name_per_user? 

def unique_device_name_per_user? 
    user = User.find(user_tokens.first.user_id) 
    token = user.tokens.where(device_name: device_name) 

    if token.present? 
    self.errors.add(:device_name, ": This user has already registered this device_name.") 
    end 
end