Могу ли я использовать общие области ActiveRecord (область) с модулем в Rails? - PullRequest
7 голосов
/ 28 августа 2011

В rails3 я делаю такие же прицелы в модели. например

class Common < ActiveRecord::Base
  scope :recent    , order('created_at DESC')
  scope :before_at , lambda{|at| where("created_at < ?" , at) }
  scope :after_at  , lambda{|at| where("created_at > ?" , at) }
end

Я хочу разделить общие области для модуля в lib. Поэтому я стараюсь вот так.

module ScopeExtension
  module Timestamps
    def self.included(base)
      base.send :extend, ClassMethods
    end

    module ClassMethods
      scope :recent      , lambda{order('created_at DESC')}
      scope :before_at   , lambda{|at| where("created_at < ?" , at) }
      scope :after_at    , lambda{|at| where("created_at > ?" , at) }
    end
end

и я пишу это

class Common < ActiveRecord::Base
  include ScopeExtension::Timestamps
end

Но Rails показывает эту ошибку.

undefined method `scope' for ScopeExtension::Timestamps::ClassMethods:Module

(я не забыл автозагрузку библиотеки)

Как я могу легко повторно использовать общую область видимости в активной записи?

Полагаю, эта проблема связана с последовательностью загрузки. Но я понятия не имею, чтобы решить. Пожалуйста, намекните мне.

Ответы [ 2 ]

9 голосов
/ 26 сентября 2011

Я решил это, назвав область видимости для self.included (class):

module Timestamps
   def self.included(k)
      k.scope :created_yesterday, k.where("created_at" => Date.yesterday.beginning_of_day..Date.yesterday.end_of_day)
      k.scope :updated_yesterday, k.where("created_at" => Date.today.beginning_of_day..Date.today.end_of_day)
      k.scope :created_today, k.where("created_at" => Date.today.beginning_of_day..Date.today.end_of_day)
      k.scope :updated_today, k.where("created_at" => Date.today.beginning_of_day..Date.today.end_of_day)
   end
end
6 голосов
/ 22 июня 2012

В Rails 3 нет разницы между объявленной областью действия и методом класса, который возвращает ActiveRecord::Relation, поэтому может быть более элегантно использовать модуль mixin:

class MyClass < ActiveRecord::Base
  extend ScopeExtension::Timestamps
end

module ScopeExtension
  module Timestamps
    def recent
      order('created_at DESC')
    end

    def before_at(at)
      where('created_at < ?' , at)
    end

    def after_at(at)
      where('created_at > ?' , at)
    end
  end
end

MyClass.after_at(2.days.ago).before_at(1.hour.ago).recent
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...