2009-11-06 3 views

ответ

8

я сделать это, поместив этот код в 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 

, а затем включить модуль в каждой модели, где они нужны мне:

class MyModel < ActiveRecord::Base 
    include HasCommonNamedScopes 

Я бы рекомендовал использовать base.table_name для квалифицируйте таблицу при обращении к столбцам в этих названных областях, как это делается в примере. В противном случае вы столкнетесь с проблемами с неоднозначными ссылками при объединении этих названных областей с другими областями, которые объединяются в другие таблицы.

Update:

scope используется в Rails> 3 и named_scope использовался в предыдущих версиях.

1

Существует также Thoughtbot's Pacecar, который добавляет кучу очень общих названных областей для каждой модели. Он может прийти с тем, что вы ищете. Если вам что-то нужно, то Casper Fabricius имеет правильную идею.

0

Для проекта Rails4 я достиг этого путем расширения ActiveRecord::Base, класс все модели Rails наследуют от, в инициализатор (обезьяна ремонтного подход, берегитесь)

# 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) 
Смежные вопросы