防止在Rails模型中更改一个字段

pjm*_*rse 19 validation hobo ruby-on-rails-3

我有两个相关的模型 - 让我们说ActivityStep.Activity has_many :steps并且Step belongs_to :activity,这意味着该表用于steps具有activity_id列.

这是在Hobo 1.3,所以Rails 3.0.

我想要的是确保Step创建之后无法将步骤移动到另一个步骤Activity.我们不希望这个activity_id领域发生变化.

我已从编辑表单中删除了该字段,但我正在寻找更强的约束.基本上我想验证update(不是create)该列没有被触及.Hobo的文档并没有提出Hobo中的任何类型,所以我正在研究Rails验证,但到目前为止我还没有找到"我只记得更新"这个约束,也没有找到某些东西的验证.改变.

Der*_*don 44

您可以使用read_only声明属性attr_readonly :your_field_name.但是,如果您尝试编写此属性,则不会创建错误,它将无提示失败.(对于所有SQL更新,将忽略此属性)

另一种选择可能是,为此案例编写验证,可能如下所示:

class Step < ActiveRecord::Base
  validate :activity_id_not_changed

  private

  def activity_id_not_changed
    if activity_id_changed? && self.persisted?
      errors.add(:activity_id, "Change of activity_id not allowed!")
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

persisted? 返回true,如果这不是新记录且未被销毁.

链接:

http://api.rubyonrails.org/classes/ActiveRecord/ReadonlyAttributes/ClassMethods.html#method-i-readonly_attributes

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F


hlc*_*lcs 12

使用验证包含:

  validates :activity_id,
            inclusion: { in: ->(i) { [i.activity_id_was] } },
            on: :update
Run Code Online (Sandbox Code Playgroud)

不需要额外的方法。