我正在努力使列只有在空白时才能填充和更新。与attr_readonly
类似,但如果属性为空,则允许更新。
这是我的悲惨尝试,它失败了,因为before_update
试图在实例上调用attr_readonly
。
before_update :check_attrs
def check_attrs
if column_1.present?
attr_readonly :column_1
elsif column_2.present?
attr_readonly :column_2
elsif column_3.present?
attr_readonly :column_3
elsif column_4.present?
attr_readonly :column_4
end
end
答案 0 :(得分:1)
我将假设我们正在讨论一个扩展ActiveRecord::Base
的'模型'类......
我的想法是使用验证来强制执行规则:除非原始值为空,否则无法设置值。
虽然是另一个问题,但这有助于:Pass field name as parameter to custom validation method Rails 4
validates_each的API文档:
validates_each :column_1, :column_2, :column_3, :column_4 do |record, attr, value|
attr_was_present = record.changed_attributes[attr].present?
record.errors.add(attr, 'can only change if blank') if attr_was_present
end
PS:这可以是一个单行,我添加了一个局部变量(希望)增加一点清晰度。
这将做的是在尝试更改它的任何属性的错误列表中添加“只能更改为空白”错误。然后save
将失败,数据库记录将不会更改。