验证两个表/模型中

时间:2015-04-23 20:07:56

标签: ruby-on-rails ruby-on-rails-4.2

我的Rails应用程序中有两种不同类型的用户(设计)模型。医生和病人。我没有定义上层用户并从中继承属性,这是我的错。它们具有相互属性 - 个人识别号,我想在两个表中检查此属性的两个唯一性。我搜索了一下,看到this answer

我已经应用了写在那里的东西,但它没有效果。

#patient.rb 
class Patient < ActiveRecord::Base

...
  validates_uniqueness_of :pin 
  validate :pin_not_on_doctors

  private

    def pin_not_on_doctors
        Doctor.where(:pin => self.pin).first.nil?
    end
end
#doctor.rb
class Doctor < ActiveRecord::Base

...
  validates_uniqueness_of :pin 
  validate :pin_not_on_patients

  private

    def pin_not_on_patients
        Patient.where(:pin => self.pin).first.nil?
    end
end

首先,我创建了一个患者实例,然后使用我在第一个(患者)病例中使用的相同针脚的医生实例。 Rails意外地没有吐出错误信息并创建了医生实例,更有趣的是,设计也对重复的电子邮件视而不见。

我该如何克服这个问题?

2 个答案:

答案 0 :(得分:1)

您应该在验证功能上添加错误: http://api.rubyonrails.org/classes/ActiveModel/Errors.html

def pin_not_on_doctors
    errors.add :pin, "already exists" if Doctor.exists?(:pin => self.pin)
end

答案 1 :(得分:1)

除了添加错误之外,请尝试添加一行以返回true / false,

类似的东西,

def pin_not_on_doctors
    errors.add :pin, "already exits" if Doctor.exists?(:pin => self.pin)
    Doctor.exists?(:pin => self.pin)
end

我不知道你的应用程序的详细信息,但是根据你在这种情况下实际创建对象的方式,它可能需要它。

编辑:误读原文中的内容,看起来你当前的版本只是返回true / false,所以这可能没有帮助。遗憾。