私はRuby on Rails 3.2.2を使用していますが、@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
インスタンスのちょうど複製(id
なしと変化していること@article
属性なし)Article
オブジェクトとでなければなりません。
いくつかのRuby on Railsメソッド(ActiveRecord::Base.dup
またはActiveModel::Dirty.changed_attributes
など)で試してみましたが、解決策が見つかりませんでした。さらに、には、自分のアプローチに比べて、私がしたいことを達成するためのより良い方法があると思います。もしそうなら、私は何をするでしょうか?私は、例えば、記事が公開されている場合ので、タイトルの値を変更することはできませんなければならないことをやりたい
。記事がプライベートであれば、タイトル値を変更することが可能でなければなりません。もちろん、私は編集した記事データを保存する前にそのチェックを行い、そのデータを更新しようとするすべての試み(このために私はbefore_save
コールバックを使用することにしました)を行う必要があります。しかし、ユーザーがタイトル値とプライベート値をpublicに変更しようとすると、すべてのチェックはパブリック "コンテキスト"で実行されますが、以前のステータスがプライベートであったため、これらのチェックはプライベート "コンテキスト" 。
でそれを作ることが可能です:ここで
はRailsの中のdiff拡張へのリンクです:そして、あなたが保存する前には、組み込みのだレールにハッシュ.diff
メソッドを使用することができます簡単/明確な方法(たとえば、ブロックを使用しない)? – user12882はい、ブロックは必要ありません。 'old_title、new_title = @ article.changes ['title']'はこのトリックを行うべきです。 –
@マークトーマス - 私がこの問題で使用しようとしているアプローチが正しいと仮定すると、私は属性を適切に設定し、単純に属性値ではなくインスタンス変数を必要とします。 – user12882