Rails嵌套形式具有唯一性条件

时间:2011-03-25 16:35:24

标签: ruby-on-rails nested-forms

Rails 2.3.5,Ruby 1.8.7。

我有三个模型,Person,AcademicTerm和PersonTermStatus。

class PersonTermStatus {
  belongs_to :academic_term
  belongs_to :person
  validates_uniquness_of :academic_term_id, :scope => :person_id
  @ ...
}

class Person {
  has_many :person_term_statuses
}

在Person记录的动态嵌套表单中,我允许编辑person_term_statuses。但是如果用户执行以下任一操作,我会收到验证错误:

  1. 删除状态并在同一更改中创建一个具有相同学术用语的新状态。
  2. 在两种现有状态之间交换学术用语。
  3. 我明白为什么会这样。在(1)中,在验证新状态的单一状态之前,实际上没有删除标记为删除的状态。在(2)中,在任何变化之前再次应用单一性条件,并且它找到具有相同学术期限的另一个记录。

    问题是,我无法想办法解决这个问题。有没有已知的解决方案?

    (我的嵌套表单implmenetation正好使用RailsCast [Part IPart II)中的技术

1 个答案:

答案 0 :(得分:0)

我知道没有解决方法。但是,您可以向数据库添加外键以强制数据库端的唯一性,然后使用以下方法。

将一个before_validation添加到父模型中,删除并重新创建所有子项的新记录。然后添加一个自定义验证函数,根据内存中的内容(而不是数据库中的内容)手动检查子记录的唯一性。

这种方法的缺点包括:

  • 孩子们不会保留相同的ID。
  • 创建的时间戳更改。