Frage

In meinem Post.rb Modell, ich habe default_scope :conditions => {:deleted => 'false'}

Aber wenn ich versuche, Post.find(:all, :conditions => "deleted='false'") zu laufen, wird es nichts zurück. Es ist, als ob die default_scope Vorrang vor allem nimmt.

Ich will es so, dass wenn ich Post.find() tun es nicht gelöschte Beiträge zurück, aber ich möchte auch sie Zugang können, wenn ich muss. Was muss entweder in meiner Anfrage oder mein Rails-Modell geändert werden?

Danke.

War es hilfreich?

Lösung

with_exclusive_scope ist protected, so dass Sie eine Klassenmethode erstellen haben:

def self.include_deleted_in
  Event.with_exclusive_scope { yield }
end

dann in Ihrem Controller Anruf

Post.include_deleted_in { Post.find(:all) }

Andere Tipps

Dies war irgendwie links versteckt:)

Just Verwendung Post.unscoped.where(:deleted => true), wenn Sie mit Rails 3

geht Credits zum José Valim hierfür.

with_exclusive_scope

 Post.with_exclusive_scope { Post.find(:all) }

Scopes sollen zusammensetzbare sein, das heißt, Sie ein paar von ihnen verbinden kann und es wirksam anwendet alle Bedingungen. In diesem Fall ist nur Active zu naiv, um zu bestimmen, dass die ausdrückliche Bedingung, die ersten negieren soll. Es baut nur die Abfrage alle Klauseln mit ANDs Beitritt. Aus diesem Grunde default_scope hat die meisten Utility mit dem: um Klauseln, die nicht zusammensetzbare ist (in Activerecord 2.3 Implementierung sowieso). Es gibt mehr Diskussion hier .

Beachten Sie auch, dass in Rails 3 Active verwendet Arel für viele Abfrage Konstruktion, die wird stark die Macht der Active Abfrage Generation erhöhen, während eine Menge der Einbauten zu vereinfachen. Es ist wahrscheinlich, dass mit Arel Ihre Situation zu verbessern. In der Zwischenzeit empfiehlt sich, ich nicht Bedingungen in einem default_scope es sei denn, es Zeilen sind, dass Sie auf Ihre Rails-Anwendung wirklich unsichtbar sein wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top