19 Stimmen

Überschreiben von default_scope in Rails

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

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

Ich möchte, dass ich, wenn ich es tue Post.find() Es gibt keine gelöschten Beiträge zurück, aber ich möchte auch in der Lage sein, auf sie zuzugreifen, wenn ich brauche. Was muss entweder in meiner Abfrage oder meinem Rails-Modell geändert werden?

Merci.

60voto

edgerunner Punkte 14594

Dieser wurde irgendwie versteckt gelassen :)

Verwenden Sie einfach Post.unscoped.where(:deleted => true) wenn Sie Rails 3 verwenden

Die Anerkennung geht an José Valim für diese.

17voto

bdon Punkte 2038

with_exclusive_scope es protected Sie müssen also eine Klassenmethode erstellen:

def self.include_deleted_in
  Event.with_exclusive_scope { yield }
end

dann rufen Sie in Ihrem Controller

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

1voto

semanticart Punkte 5346

Verwenden. mit_exklusivem_Umfang

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

1voto

gtd Punkte 16428

Scopes sollen zusammensetzbar sein, d.h. man kann eine Reihe von ihnen kombinieren und es werden alle Bedingungen angewendet. In diesem Fall ist ActiveRecord einfach zu naiv, um festzustellen, dass die explizite Bedingung die erste negieren sollte. Es erstellt einfach die Abfrage, indem es alle Klauseln mit ANDs verknüpft. Aus diesem Grund hat default_scope den größten Nutzen mit den :order-Klauseln, die nicht zusammensetzbar sind (in der Implementierung von ActiveRecord 2.3 jedenfalls). Es gibt eine weitere Diskussion aquí .

Beachten Sie auch, dass in Rails 3 ActiveRecord mit Arel für einen Großteil der Abfragekonstruktion, was die Leistungsfähigkeit der ActiveRecord-Abfragegenerierung erheblich steigert und gleichzeitig einen Großteil der Interna vereinfacht. Es ist wahrscheinlich, dass sich Ihre Situation mit Arel verbessern wird. In der Zwischenzeit empfehle ich, keine Bedingungen in ein default_scope zu setzen, es sei denn, es gibt Zeilen, die für die Rails-App wirklich unsichtbar sein sollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X