我有两个相关的模型 – 比如说活动和步骤.活动has_many:steps和Step belongs_to:活动,这意味着步骤表具有一个activity_id列.
这是在Hobo 1.3,所以Rails 3.0.
我想要的是确保在创建步骤之后不可能将步骤移动到另一个活动.我们不希望更改activity_id字段.
我从编辑表单中删除了该字段,但我正在寻找一个更强的约束.本质上,我想验证更新(而不是创建)列不被触摸. Hobo的文档没有提到Hobo中的任何内容,所以我正在看Rails validations,但到目前为止,我还没有发现我记得的“只做更新”约束,也没有发现某些东西不是改变.
解决方法
您可以使用attr_readonly:your_field_name将属性声明为read_only.
但是,如果您尝试编写此属性,则不会创建错误,它将以静默方式失败.
(所有sql更新将忽略此属性)
但是,如果您尝试编写此属性,则不会创建错误,它将以静默方式失败.
(所有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
坚持?返回true,如果这不是一个新的记录,它不会被销毁.
链接:
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F