2009-11-06 4 views

Répondre

8

je le fais en plaçant ce code dans lib/has_common_named_scopes.rb:

module HasCommonNamedScopes 
    def self.included(base) 
    base.class_eval { 
     # Named scopes 
     named_scope :newest, :order => "#{base.table_name}.created_at DESC" 
     named_scope :freshest, :order => "#{base.table_name}.updated_at DESC" 
     named_scope :limit, lambda { |limit| {:limit => limit} } 
    } 
    end 
end 

puis inclure le module dans chaque modèle où je besoin d'eux:

class MyModel < ActiveRecord::Base 
    include HasCommonNamedScopes 

Je vous recommande d'utiliser base.table_name à qualifier la table en faisant référence à des colonnes dans ces étendues nommées comme je le fais dans l'exemple. Sinon, vous rencontrez des problèmes avec des références ambiguës lorsque vous combinez ces étendues nommées avec d'autres étendues qui se joignent à d'autres tables.

Mise à jour:

scope est utilisé dans Rails> 3 et named_scope a été utilisé dans les versions précédentes.

1

Il ya aussi Thoughtbot's Pacecar, qui ajoute un tas d'étendues nommées très communes à chaque modèle. Il pourrait venir avec ce que vous cherchez. Si vous avez besoin de quelque chose de personnalisé, cependant, Casper Fabricius a la bonne idée.

0

Pour un projet Rails4 j'ai réalisé en prolongeant ActiveRecord::Base, la classe tous les modèles Rails héritent de, dans un initialiseur (approche de rapiéçage de singe, méfiez-vous)

# in /config/initializers/shared_scope_initializer.rb 
module SharedScopes 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def named_scope 
     return where(attribute: value) # query here 
    end 
    end 
end 

ActiveRecord::Base.send(:include, SharedScopes) 
Questions connexes