私のモデル「Post.rb」では、削除された列が0の場合にのみ投稿を返すようにしています。つまり、ユーザーが投稿を削除しても、データベースからアイテムは削除されず、削除されます。したがって、Post.find(:all)を実行すると、条件「deleted='0'」が自動的に追加されます。モデルからこれを行うにはどうすればよいですか?
ありがとう!
私のモデル「Post.rb」では、削除された列が0の場合にのみ投稿を返すようにしています。つまり、ユーザーが投稿を削除しても、データベースからアイテムは削除されず、削除されます。したがって、Post.find(:all)を実行すると、条件「deleted='0'」が自動的に追加されます。モデルからこれを行うにはどうすればよいですか?
ありがとう!
はい、これは最も簡単な方法であり、削除されたエントリを気にせずにdefault_scope
使用し続けることができますが、とにかく削除されたレコードを保持している理由を自問することをお勧めします。Post.find(:all)
それらを削除するだけで価値のあるものを失いますか?もしそうなら、「ソフト削除」よりも良い答えがあるかもしれません。 たとえば、ソフト削除の問題は、この慣行に非常に強く反論し、それらを回避するためのいくつかの提案を提供します。
私は個人的には何も反対していませんdefault_scope
が、それは厄介になる可能性があり、それを使用した数回は、常に戻って削除するかwith_exclusive_scope
、モデルに醜いヘルパーメソッドを入れて明示的に回避する必要がありました。
したがって、それほど簡単ではありませんが、代わりにPost.find(:all)
使用することをお勧めしますnamed_scope
class Post < ActiveRecord::Base
named_scope :active, :conditions => {:deleted => 0}
end
次に、Post.active.find(:all)
またはを使用しPost.active.find(params[:id])
ます。コードの意図をより明確に伝えていると思います。ビジネスロジックが変更された場合に、将来的に「アクティブ」となるものを再定義できます。また、本当に取得しwith_exclusive_scope
たい場合は、フープを飛び越えることはありません。Post.find(:all)
たとえば、管理アプリ)。
編集:私が推測したように、あなたはすでにそれを回避する方法を探しているようです。:)
編集2:acts_as_paranoid gemを確認することをお勧めします。これは、このようなものの多くを管理しているように見えます(ただし、を使用せずに削除されたレコードにアクセスできますwith_exclusive_scope
)。
Post.rb
最も簡単な方法は、おそらくモデルにデフォルトのスコープを追加することです。
default_scope :conditions => {:deleted => 0}
モデルでは、 default_scopeを指定する必要があります 。これらの削除された投稿を実際に取得する場合は、デフォルトのスコープをオーバーライドする必要があります。
class Post <ActiveRecord:Base default_scope:conditions => {:deleted => 0'} end