2009-08-25 8 views

Odpowiedz

17

Można użyć default_scope:

class ExampleModel < ActiveRecord::Base 
    default_scope :conditions => ["status = ?", "active"] 
end 

Jeśli chcesz użyć tego we wszystkich modelach, to albo można podklasa ActiveRecord::Base i czerpać z tego we wszystkich modelach (prawdopodobnie nie działa dobrze z jedno- tabela dziedziczenie):

class MyModel < ActiveRecord::Base 
    default_scope :conditions => ["status = ?", "active"] 
end 
class ExampleModel < MyModel 
end 

... czy można ustawić default_scope na samej ActiveRecord::Base (może być irytujące, jeśli uznasz, że jeden model nie powinien mieć tego domyślnego zakresu):

class ActiveRecord::Base 
    default_scope :conditions => ["status = ?", "active"] 
end 
class ExampleModel < ActiveRecord::Base 
end 

Jak wspomniano przez klochner w komentarzu, można także rozważyć dodanie named_scope do ActiveRecord::Base, nazwany active, na przykład:

class ActiveRecord::Base 
    named_scope :active, :conditions => ["status = ?", "active"] 
end 
class ExampleModel < ActiveRecord::Base 
end 
ExampleModel.active # Return all active items. 
+0

jak o nazwanym zakresie w ActiveRecord :: Base? Byłoby mniej prawdopodobne, że pomylimy innych deweloperów, jeśli projekt zostanie udostępniony. – klochner

+0

@klochner, tak, dobry punkt. Używanie czegoś takiego jak ExampleModel.active jest bardzo ekspresyjne. – molf

+0

, aby nieco go oczyścić, możesz wyprowadzić klasę z ActiveRecord, która ma nazwany (lub nowy domyślny) zakres, i wyprowadzić z niej PrzykładModel. Teraz nowa funkcja jest jawna. – klochner

0

Aktualizacja:named_scope był deprecated/renamed w Rails 3.1. Począwszy od 3.2.8 nowa metoda nazywa scope która wykorzystuje metodę where zamiast :conditions

Wiek:

named_scope :active, :conditions => ["status = ?", "active"] 

Nowość:

scope :active, where(:status => "active") 

lub

scope :active, where("status = ?", "active") 
Powiązane problemy