如何根据另一个模型为一个模型添加唯一性验证



我想为每个"用户"验证一个"房屋名称"。如果我只放入
验证:House_name,唯一性:true然后它会检查所有的姓氏。我只想根据我的当前用户进行验证。即,一个用户不能在同一名称中具有多个房屋名称,但其他用户可以具有相同的房屋名称。

我之前也遇到过类似的问题。根据您的设置方式,有两种解决方案。

  1. user.rb中,您可以添加这样的自定义方法(假设User有一个名为house_names的数组:

validate :house_name_is_unique

def house_name_is_unique
unless (house_names.length == houses.uniq.length)
errors.add(:house_names, :blank, message: "name taken")
end
end

上面的代码将检查房屋名称的数组,uniq方法会过滤掉重复的名称,所以如果它们的长度相同,就没有重复的名称了,所以什么也不做,否则就会抱怨。

  1. 使用scope(未测试(您可以将以下内容添加到house.rb类中

validates :name, uniqueness: { scope: :user_id, message: "no duplicate house name" }

您可以在此处阅读有关范围的更多信息:http://guides.rubyonrails.org/active_record_validations.html#uniqueness

假设您的user模型具有has_many: houses关联,您可以尝试以下操作:

validate :house_uniqueness
def house_uniqueness
errors.add(:base, "House name has been taken") if House.exists?(user: self, name: 
self.house_name)
end

试试这个:

class User
has_many :houses
end
class House
belongs_to :user
validates_uniqueness_of :name, scope: :user_id
end

API文件