ruby-on-rails - what - wikipedia ruby on rails




Override di Rails default_scope (6)

È possibile sovrascrivere un ambito predefinito utilizzando il metodo with_exclusive_scope . Così:

foos = Foo.with_exclusive_scope { :conditions => ["baz = ?", baz] }

Se ho un modello ActiveRecord :: Base con un ambito di default:

class Foo < ActiveRecord::Base

  default_scope :conditions => ["bar = ?",bar]

end

C'è un modo per fare un Foo.find senza usare le condizioni default_scope ? In altre parole, puoi sovrascrivere un ambito predefinito?

Avrei pensato che usare "default" nel nome suggerisse che era sovrascrivibile, altrimenti sarebbe stato chiamato qualcosa come global_scope , giusto?


Bene, puoi sempre usare il preferito di vecchia data find_by_sql con la query completa. Ad esempio: Model.find_by_sql ("SELECT * FROM models WHERE id = 123")


Dal 4.1 puoi usare ActiveRecord::QueryMethods#unscope per combattere lo scope di default:

class User < ActiveRecord::Base
  default_scope { where tester: false }
  scope :testers, -> { unscope(:where).where tester: true }
  scope :with_testers, -> { unscope(:where).where tester: [true, false] }
  # ...
end

È currently possibile unscope l' unscope cose come:: :where, :select, :group, :order, :lock, :limit, :offset, :joins, :includes, :from, :readonly, :having unscope :where, :select, :group, :order, :lock, :limit, :offset, :joins, :includes, :from, :readonly, :having .

Ma per favore, evita di usare default_scope se puoi . È per il tuo bene.


In Rails 3:

foos = Foo.unscoped.where(:baz => baz)

Risposta breve: non usare default_scope meno che non sia necessario. Probabilmente starai meglio con gli scope nominati. Detto questo, puoi usare with_exclusive_scope per sovrascrivere l'ambito predefinito se necessario.

Dai un'occhiata a questa domanda per maggiori dettagli.


Se tutto ciò che serve è modificare l'ordine definito in default_scope , è possibile utilizzare il metodo di reorder .

class Foo < ActiveRecord::Base
  default_scope order('created_at desc')
end

Foo.reorder('created_at asc')

esegue il seguente SQL:

SELECT * FROM "foos" ORDER BY created_at asc




ruby-on-rails