我正在使用 Ruby on Rails 3.2.2,我想在实例存储到数据库之前根据之前的状态运行一些检查。@article
也就是说,我必须运行一些方法来利用已经存储在数据库中的相关数据@article
(在下面的情况下,数据是{:id => 1, :title => "Sample title", :content => "Sample content", :status => "private"}
和不是 {:id => 1, :title => "Sample title changed!", :content => "Sample content", :status => "private"}
)。
我想在其属性值更改后继续“检索”/“重新构建”原始实例。那是:
# In the controller file
# @article.attributes
# => {:id => 1, :title => "Sample title", :content => "Sample content", :status => "private"}
@article.update_attributes(params[:article])
# => {:id => 1, :title => "Sample title changed!", :content => "Sample content", :status => "private"}
# In the model file
before_save :retrieve_original
def retrieve_original
# self.attributes
# => {:id => 1, :title => "Sample title changed!", :content => "Sample content", :status => "private"}
original = ... # ?
# original.id
# => nil
# original.attributes
# => {:title => "Sample title", :content => "Sample content", :status => "private"}
# self.attributes
# => {:id => 1, :title => "Sample title changed!", :content => "Sample content", :status => "private"}
end
因此,original
应该是一个Article
对象,并且只是@article
实例的副本(没有id
和没有该@article
属性已更改)。
我尝试使用一些 Ruby on Rails 方法(如ActiveRecord::Base.dup
or ActiveModel::Dirty.changed_attributes
),但我还没有找到解决方案。此外,与我的方法相比,我认为有更好的方法来完成我想做的事情。 如果是这样,我可能会做什么?
我想这样做是因为,例如,如果一篇文章是公开的,那么应该不可能更改标题值;如果文章是私有的,则应该可以更改标题值。当然,我必须在存储编辑过的文章数据之前进行检查,并且对于所有尝试更新该数据的尝试(为此我选择使用before_save
回调)。但是,如果用户尝试将标题值和私有值更改为公共,那么所有检查都在公共“上下文”中运行,但我希望这些检查仍然在私有“上下文”中运行,因为之前的状态是私有的.