0

私のモデル「Post.rb」では、削除された列が0の場合にのみ投稿を返すようにしています。つまり、ユーザーが投稿を削除しても、データベースからアイテムは削除されず、削除されます。したがって、Post.find(:all)を実行すると、条件「deleted='0'」が自動的に追加されます。モデルからこれを行うにはどうすればよいですか?

ありがとう!

4

3 に答える 3

3

はい、これは最も簡単な方法であり、削除されたエントリを気にせずに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)たとえば、管理アプリ)。

編集:私が推測したように、あなたはすでにそれを回避する方法を探しているようです。:)

編集2acts_as_paranoid gemを確認することをお勧めします。これは、このようなものの多くを管理しているように見えます(ただし、を使用せずに削除されたレコードにアクセスできますwith_exclusive_scope)。

于 2010-01-15T18:30:04.407 に答える
2

Post.rb最も簡単な方法は、おそらくモデルにデフォルトのスコープを追加することです。

default_scope :conditions => {:deleted => 0}
于 2010-01-15T16:41:47.313 に答える
1

モデルでは、 default_scopeを指定する必要があります 。これらの削除された投稿を実際に取得する場合は、デフォルトのスコープをオーバーライドする必要があります。

class Post <ActiveRecord:Base default_scope:conditions => {:deleted => 0'} end

于 2010-01-15T16:43:36.407 に答える