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
や などActiveModel::Dirty.changed_attributes
) を試してみましたが、解決策が見つかりませんでした。さらに、自分のやりたいことを実現するには、自分のアプローチよりも優れた方法があると思います。 もしそうなら、私は何をすればよいですか?
たとえば、記事が公開されている場合、タイトルの値を変更できないようにする必要があるためです。記事が非公開の場合、タイトルの値を変更できる必要があります。もちろん、編集した記事のデータを保存する前に、そのデータを更新しようとするすべての試行に対して、そのチェックを行う必要があります (これには、before_save
コールバックを使用することにしました)。ただし、ユーザーがタイトルの値とプライベートの値をパブリックに変更しようとすると、すべてのチェックがパブリックの「コンテキスト」で実行されますが、以前のステータスが非公開だったため、これらのチェックは引き続きプライベートの「コンテキスト」で実行されることを望みます.