Ruby 如何确保属性在Rails3活动记录中只更新一次?
想知道什么是最好的方式来处理我需要更新特定列的情况,并且一旦更新,它就不允许用户再次更新 我尝试使用更改?方法检查已更改但尚未保存的记录。但这不会检查该行中的特定属性 有什么建议吗 提前谢谢Ruby 如何确保属性在Rails3活动记录中只更新一次?,ruby,ruby-on-rails-3,activerecord,Ruby,Ruby On Rails 3,Activerecord,想知道什么是最好的方式来处理我需要更新特定列的情况,并且一旦更新,它就不允许用户再次更新 我尝试使用更改?方法检查已更改但尚未保存的记录。但这不会检查该行中的特定属性 有什么建议吗 提前谢谢 rails g migration add_value_changed_to_YOUR_TABLE_NAME value_changed:boolean 在生成的文件中设置 default: false 然后运行迁移 现在,值更改后,将此值\u changed更新为true: before_update
rails g migration add_value_changed_to_YOUR_TABLE_NAME value_changed:boolean
在生成的文件中设置
default: false
然后运行迁移
现在,值更改后,将此值\u changed
更新为true
:
before_update :update_value_changed, :check_value_changed
private
def update_value_changed
update(value_changed: true) unless value_changed
end
def check_value_changed
if value_changed
do_something_like_raise_error_or_do_not_save_changes
else
something_else
end
end
在生成的文件中设置
default: false
然后运行迁移
现在,值更改后,将此值\u changed
更新为true
:
before_update :update_value_changed, :check_value_changed
private
def update_value_changed
update(value_changed: true) unless value_changed
end
def check_value_changed
if value_changed
do_something_like_raise_error_or_do_not_save_changes
else
something_else
end
end
假设您有用户类:
class User < ActiveRecord::Base
before_save :check_name_not_changed
private
def check_name_not_changed
if self.name.present? && self.name_changed?
errors.add(:name, "can not be updated")
end
end
end
class用户
我假设name属性是以前设置的。假设您有用户类:
class User < ActiveRecord::Base
before_save :check_name_not_changed
private
def check_name_not_changed
if self.name.present? && self.name_changed?
errors.add(:name, "can not be updated")
end
end
end
class用户
我假设name属性是以前设置的。您可以更改name\u吗?要检查属性“name”changed@Anton我尝试了这个方法,但在检查特定属性时得到了NoMethodError:undefined方法。您能准确地发布您所做的事情和控制台输出吗?Thanks@Anton它给出了1.8.7-p374:005>user.name\u changed?=>false,但实际上它正在检查我假设的整行,因为我确实更改了值。因此,现在我在字段中检查updated_,以检查行是否已更新。注意:Ruby 1.8.7不再维护已经将近4年了(扩展维护结束已经3年了)。考虑升级。你能改变名字吗?要检查属性“name”changed@Anton我尝试了这个方法,但在检查特定属性时得到了NoMethodError:undefined方法。您能准确地发布您所做的事情和控制台输出吗?Thanks@Anton它给出了1.8.7-p374:005>user.name\u changed?=>false,但实际上它正在检查我假设的整行,因为我确实更改了值。因此,现在我在字段中检查updated_,以检查行是否已更新。注意:Ruby 1.8.7不再维护已经将近4年了(扩展维护结束已经3年了)。考虑升级。谢谢AndreyDeineko。我会试试这个。同时,为确保行被更新,我考虑了另一个解决方法,我正在检查字段中是否有更新的\u,以检查行是否被更新。@EktaVerma这不是一个好主意,因为您可以多次更新行,但您感兴趣的列可以保持不变。当然,是的,在这种情况下使用更新的\u不是一个好方法。谢谢你,谢谢你。我会试试这个。同时,为确保行被更新,我考虑了另一个解决方法,我正在检查字段中是否有更新的\u,以检查行是否被更新。@EktaVerma这不是一个好主意,因为您可以多次更新行,但您感兴趣的列可以保持不变。当然,是的,在这种情况下使用更新的\u不是一个好方法。非常感谢。