这是我认为非常容易的事情,但事实证明并非如此。
我试图在我的FooBarsController的更新操作中找到对某些记录所做的更改(让我们称之为FooBar)。
不幸的是,似乎ActiveRecord :: Persistence中定义的.update方法不会更新记录上的changes
属性。
For Instance:
def update
@resource = FooBar.find(params[:id])
if @resource.update(resource_params)
@resource.changes # => {}
render json: @resource
else
render_validation_errors @resource.errors
end
end
这是为什么?有谁知道如何获得更改?
注意:我不想使用模型钩子。我试图与更改一起使用的代码将使用current_user
方法,因此,使用模型钩子将是各种脏。
答案 0 :(得分:0)
我认为您正在寻找ActiveModel::Dirty模块。
它有一个changed_attributes方法,它会为您提供未保存更改的属性哈希,指示其原始值
e.g。
person.name # => "bob"
person.name = 'robert'
person.changed_attributes # => {"name" => "bob"}
此外,有一个很棒的宝石paper_trail可以帮助跟踪模型的变化。数据。这也可能对你有用!从它的github页面:
跟踪模型的更改,以进行审核或版本控制。看看如何 model查看其生命周期的任何阶段,将其恢复为任何版本, 或者在它被摧毁后恢复它。
答案 1 :(得分:0)
发现它!
因此,有一个名为.previous_changes
的奇妙事物可以找到在上一个事务中所做的更改,因此依赖于调用更新方法,而不是避免它。
有了这个,我就能做到:
def update
@resource = FooBar.find(params[:id])
if @resource.update(resource_params)
@resource.previous_changes # => {'some' => 'changes', 'attribute' => 'new value'}
render json: @resource
else
render_validation_errors @resource.errors
end
end