2009-08-25 49 views

回答

17

你可以使用default_scope

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

如果你想在所有的機型使用此,您可以子類ActiveRecord::Base和所有模型從中導出(可能不與單很好地工作表繼承):

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

...或者你可以設置ActiveRecord::Base本身default_scope(如果你決定一個模型不應該有此默認範圍可能是討厭):

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

正如在評論中提到的klochner,你可能還需要考慮增加一個named_scopeActiveRecord::Base,命名爲active,例如:

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

如何關於ActiveRecord :: Base的命名範圍?如果項目得到共享,那麼混淆其他開發者的可能性就會降低。 – klochner 2009-08-25 16:14:45

+0

@ klochner,是的,好點。使用像ExampleModel.active這樣的東西非常有表現力。 – molf 2009-08-25 16:23:24

+0

來清理它多一點,你可以從ActiveRecord派生一個具有命名(或新的默認)作用域的類,並從中派生出ExampleModel。現在新功能是明確的。 – klochner 2009-08-25 19:26:40

0

更新:named_scope是Rails的3.1 deprecated/renamed。截至3.2.8,新方法被稱爲scope它使用where方法,而不是:conditions

老:

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

新:

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

scope :active, where("status = ?", "active") 
相關問題