Области видимости находятся в методах класса или экземпляра rails?

Это вопрос от рельсов-новичков, пытающихся разобраться в проблемах и возможностях.

Я всегда думал, что области видимости - это методы класса в рельсах, но на днях я увидел этот код из DHH:

module Visible
  extend ActiveSupport::Concern`

  module ClassMethods
    def visible_to(person)
      where \
        "(#{table_name}.bucket_id IN (?) AND
          #{table_name}.bucket_type = 'Project') OR
         (#{table_name}.bucket_id IN (?) AND
          #{table_name}.bucket_type = 'Calendar')",
        person.projects.pluck('projects.id'), 
        calendar_scope.pluck('calendars.id')
    end
  end
end

Таким образом, метод visible используется следующим образом:

current_account.posts.visible_to(current_user)

Вот что меня смущает. Self вот коллекция сообщений, поэтому мы работаем с экземплярами, тогда как видимый метод, похоже, предназначен для использования в качестве метода класса. Разве Дэвид не пытается вызвать метод класса как динамическую область видимости? Может кто-нибудь уточнить?


person Amit Erandole    schedule 31.12.2012    source источник


Ответы (1)


Методы класса для классов, которые наследуют ActiveRecord :: Base, также могут использоваться как области видимости (для объектов ActiveRecord Relation).

Поскольку модуль Visible должен был быть смешан с моделью, наследующей ActiveRecord :: Base, его метод класса visible_to также может использоваться как область видимости.

Если это не устранило проблему, вы можете реализовать область действия, охватывающую всех взрослых пользователей (возраст> 20), следующими способами:

class User < ActiveRecord::Base
  scope :adult, lambda { where("age > ?", 20) } # with a scope

  class << self
    def adult # with class method
      where("age > ?", 20)
    end
  end
end

И используйте это точно так же с User.adult

person Erez Rabih    schedule 31.12.2012
comment
Таким образом, области на самом деле действуют на объекты activerecord, а также доступны в виде сообщений, которые вы можете отправить классу. Это верно? - person Amit Erandole; 31.12.2012
comment
Я не очень понимаю вопрос ... вы можете уточнить? - person Erez Rabih; 31.12.2012
comment
Я могу работать с записями, а также с классом модели в целом, используя области видимости? - person Amit Erandole; 31.12.2012
comment
Вы можете действовать с ActiveRecord :: Relation, если ваш метод класса возвращает ActiveRecord :: Relation, а не что-то еще. Это означает, что вы можете связывать области действия и методы класса, как если бы они были областями действия. - person Erez Rabih; 31.12.2012
comment
Спасибо, Эрез, что нашли время - person Amit Erandole; 31.12.2012