验证另一个表中数据的唯一性

时间:2015-06-04 14:23:57

标签: mysql ruby-on-rails validation ruby-on-rails-4 model

我有一个StudentStudent_section型号。 Student表格有student_id and roll_noStudent_sectionstudent_id, standard_id and section_id

Roll_nostandardsection中应该是唯一的。

student.rb文件中,我无法为standard and section模型中的Student_section设置唯一的roll_no自定义验证。

我在实施方面遇到了麻烦,有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

如果您使用的是RAILS 4,您可以像这样定义模型的关系,如果为true,则会从集合中省略duplcates。

has_many :student_sections, -> { uniq }, through: :students

如果您使用的是RAILS< 4版,试试这个

has_many :student_sections, :through => :students, :uniq => true

答案 1 :(得分:0)

我赞同您使用自定义验证器(这将允许您通过其错误消息以一致和详细的方式解释必须满足的条件)。你真正需要做的就是做两个不同的查询并根据结果返回:

def roll_no_must_be_unique
  # Boolean indicating if roll_no is unique within the Student table
  unique_in_student = Student.where(roll_no: roll_no).count == 0
  # Boolean indicating if roll_no is unique within the Standard table
  unique_in_standard = Standard.where(roll_no: roll_no).count == 0

  # Adds the error if either query returned non-unique
  errors.add(:roll_no, 'Error Message Here') unless unique_in_student && unique_in_standard
end

如果您觉得有意,可以在每个单独的查询后添加一条错误消息,指出它在哪个表中失败。这真的是一个偏好的问题。