Как я могу присоединиться к ассоциации has_many с областью действия в Active Record? - PullRequest
2 голосов
/ 19 сентября 2011

Это моя ассоциация и настройка объема:

has_many    :owned_products

has_many    :owned_lessons, :through => :owned_products, :source => :lesson, :conditions => "owned_products.product_type = 'Lesson'"

scope :active_purchase_scope, lambda {
    where('owned_products.created_at' => (Date.today - CONFIG['downloads']['time_window'].days)..(Date.today)).order('owned_products.created_at DESC')
}

def active_lessons 
    owned_lessons.active_purchase_scope
end

Это ошибка, которую я получаю:

ruby-1.8.7-p334 :005 > User.find_by_username('joeblow').active_lessons
NoMethodError: undefined method `active_purchase_scope' for #<User:0x1051a26c8>

да

1 Ответ

4 голосов
/ 20 сентября 2011

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 из той же модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...