gpt4 book ai didi

ruby-on-rails - 如何根据实例存储在数据库中之前的状态进行一些检查?

转载 作者:太空宇宙 更新时间:2023-11-03 18:26:18 24 4
gpt4 key购买 nike

我正在使用 Ruby on Rails 3.2.2,我想根据 @article 实例的 previous 状态运行一些检查,然后它存储在数据库。也就是说,我必须运行一些方法,利用已经存储在与 @article 相关的数据库中的数据(在下面的例子中,数据是 {:id => 1, :title => "示例标题", :content => "示例内容", :status => "private" and not {:id => 1, :title = > "示例标题已更改!", :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.dupActiveModel::Dirty.changed_attributes),但我还没有找到解决方案。此外,我认为与我的方法相比,有更好的方法来完成我想做的事情。 如果是这样,我会怎么做?


我想这样做是因为,例如,如果一篇文章是公开的,就不可能更改标题值;如果文章是私有(private)的,应该可以更改标题值。当然,我必须在存储编辑后的文章数据和所有尝试更新该数据的尝试之前进行检查(为此我选择使用 before_save 回调)。但是,如果用户尝试将标题值和私有(private)值更改为公开,则所有检查都在公共(public)“上下文”中运行,但我希望这些检查仍然在私有(private)“上下文”中运行,因为以前的状态是私有(private)的.

最佳答案

看起来你可以通过 changes散列在你的钩子(Hook)里。 IE。 dupclone 更改后的版本,然后检查更改后版本的 changes 并将属性设置回副本的属性。

关于ruby-on-rails - 如何根据实例存储在数据库中之前的状态进行一些检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10475560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com