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

时间:2018-07-23 18:48:30

标签: ruby-on-rails ruby

我想为每个“用户”验证一个“房屋名称”。 如果我只放
              验证:House_name,唯一性:true 然后它将检查所有房屋名称。我只想根据当前用户进行验证。也就是说,一个用户不能使用多个相同的房屋名称,而其他用户可以使用相同的房屋名称。

3 个答案:

答案 0 :(得分:0)

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

  1. 在您的user.rb中,您可以像这样添加自定义方法(假设用户有一个名为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

答案 1 :(得分:0)

假设您的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

答案 2 :(得分:0)

尝试一下:

class User
  has_many :houses
end

class House
  belongs_to :user
  validates_uniqueness_of :name, scope: :user_id
end

API docs