我想到的是我可以说的话:
e = Foo.new
e.bar = "hello"
e.save
e.reload
e.bar.nil!
e.reload
e.bar.nil? => true
有点像#touch,但设置为零并保存。
编辑
非常抱歉,伙计们。我的意思是:
e = Foo.new
e.bar = "hello"
e.save
e.reload
e.bar.nil!
e.reload
e.bar.nil? => true
最佳答案
也许是这样的:
module ActiveRecord
class Base
def nil!(*names)
unless persisted?
raise ActiveRecordError, <<-MSG.squish
cannot nil on a new or destroyed record object. Consider using
persisted?, new_record?, or destroyed? before nilling
MSG
end
unless names.empty?
changes = {}
names.each do |column|
column = column.to_s
changes[column] = write_attribute(column, nil)
end
primary_key = self.class.primary_key
scope = self.class.unscoped.where(primary_key => _read_attribute(primary_key))
if locking_enabled?
locking_column = self.class.locking_column
scope = scope.where(locking_column => _read_attribute(locking_column))
changes[locking_column] = increment_lock
end
clear_attribute_changes(changes.keys)
result = scope.update_all(changes) == 1
if !result && locking_enabled?
raise ActiveRecord::StaleObjectError.new(self, "nil")
end
@_trigger_update_callback = result
result
else
true
end
end
end
end
将其放入初始化程序中,它会让您使用 Comment.last.nil!(:title)
清空评论的标题。
关于ruby-on-rails - 有没有一种方法可以将 rails 中的值设置为 nil 并保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46326738/