Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何确保属性在Rails3活动记录中只更新一次?_Ruby_Ruby On Rails 3_Activerecord - Fatal编程技术网

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不是一个好方法。非常感谢。