19

私のPost.rbモデルでは、default_scope :conditions => {:deleted => 'false'}

しかし、実行しようとするとPost.find(:all, :conditions => "deleted='false'")、何も返されません。これは、default_scopeがすべてよりも優先されるかのようです。

削除した投稿が返されないようにしたいPost.find()のですが、必要に応じてアクセスできるようにしたいと思います。クエリまたはRailsモデルのいずれかで何を変更する必要がありますか?

ありがとう。

4

4 に答える 4

60

これはどういうわけか隠されたままでした:)

Post.unscoped.where(:deleted => true)Rails 3を使用している場合は、を使用してください

これについては、 JoséValimにクレジットが与えられます。

于 2010-10-17T19:00:39.423 に答える
17

with_exclusive_scopeであるprotectedため、クラスメソッドを作成する必要があります。

def self.include_deleted_in
  Event.with_exclusive_scope { yield }
end

次に、コントローラーの呼び出しで

Post.include_deleted_in { Post.find(:all) }
于 2010-01-15T18:15:24.760 に答える
1

with_exclusive_scopeを使用する

 Post.with_exclusive_scope { Post.find(:all) }
于 2010-01-15T17:52:40.640 に答える
1

スコープは構成可能であることが意図されています。つまり、スコープを組み合わせて、すべての条件を効果的に適用できます。この場合、ActiveRecordは単純すぎて、明示的な条件が最初の条件を否定する必要があると判断できません。すべての句をANDで結合するクエリを作成するだけです。このため、default_scopeは、構成できない:order句を使用した場合に最も有用です(とにかくActiveRecord 2.3の実装では)。ここでより多くの議論があります。

また、Rails 3では、ActiveRecordが多くのクエリ構築にArelを使用していることにも注意してください。これにより、多くの内部構造を簡素化しながら、ActiveRecordクエリ生成の能力が大幅に向上します。Arelを使用すると状況が改善される可能性があります。それまでの間、Railsアプリに本当に表示したくない行がない限り、default_scopeに条件を設定しないことをお勧めします。

于 2010-01-15T18:13:02.060 に答える