L'aggiunta di condizioni find a tutti i modelli record attivo in Rails
-
19-09-2019 - |
Domanda
Esiste un modo per aggiungere una condizione di ricerca per tutti i modelli record attivo?
cioè vorrei questa query
ExampleModel.find :all, :conditions=> ["status = ?", "active"]
a comportarsi allo stesso modo di
ExampleModel.find :all
in ogni modello
Grazie !!
Soluzione
Si potrebbe utilizzare default_scope
:
class ExampleModel < ActiveRecord::Base
default_scope :conditions => ["status = ?", "active"]
end
Se si desidera utilizzare questo in tutti i modelli, è possibile ActiveRecord::Base
sottoclasse e derivare da quello di tutti i vostri modelli (probabilmente non funziona bene con tavolo singolo eredità):
class MyModel < ActiveRecord::Base
default_scope :conditions => ["status = ?", "active"]
end
class ExampleModel < MyModel
end
... o si può impostare il default_scope
su ActiveRecord::Base
stesso (potrebbe essere fastidioso se si decide che una modella non dovrebbe avere questo ambito predefinito):
class ActiveRecord::Base
default_scope :conditions => ["status = ?", "active"]
end
class ExampleModel < ActiveRecord::Base
end
Come già detto da KLOCHNER in un commento, si può anche prendere in considerazione l'aggiunta di un named_scope
a ActiveRecord::Base
, chiamato active
, ad esempio:
class ActiveRecord::Base
named_scope :active, :conditions => ["status = ?", "active"]
end
class ExampleModel < ActiveRecord::Base
end
ExampleModel.active # Return all active items.
Altri suggerimenti
Aggiornamento: named_scope era href="http://apidock.com/rails/ActiveRecord/NamedScope/ClassMethods/named_scope" rel="nofollow"> deprecato / rinominato in Rails 3.1. Come del 3.2.8, il nuovo metodo è chiamato scope
che utilizza il metodo where
anziché :conditions
Vecchio:
named_scope :active, :conditions => ["status = ?", "active"]
scope :active, where(:status => "active")
o
scope :active, where("status = ?", "active")