A scope
можно рассматривать как метод класса, а association
можно рассматривать как метод экземпляра. В вашем примере кода метод owned_lessons
возвращает объект массива. Вы не можете вызвать active_purchase_scope
для объекта массива (или объекта User в этом отношении), так как область может быть вызвана только для класса Model (т.е. в вашем случае User.active_purchase_scope
)
Вы можете решить эту проблему, добавив область действия на Lesson
модель
class Lesson
has_many :owned_products
scope :active_purchase_scope, lambda {
include(::owned_products).where('owned_products.created_at' =>
(Date.today - CONFIG['downloads']['time_window'].days)..(Date.today)).
order('owned_products.created_at DESC')
}
end
И переписать класс User следующим образом:
class User
has_many :owned_products
has_many :owned_lessons, :through => :owned_products, :source => :lesson,
:conditions => "owned_products.product_type = 'Lesson'"
def active_lessons
owned_lessons.active_purchase_scope
end
end
owned_lessons
возвращает анонимную область в модели Lesson
, поэтому мы можем связать ее с областью active_purchase_scope
из той же модели.