ApplicationRecord: доступ к родительскому образцу модели в области видимости - PullRequest
0 голосов
/ 03 октября 2018

У меня возникли проблемы с пониманием области видимости и когда определенные модели доступны в моделях Rails.Я пытаюсь получить доступ к родительскому объекту EventInstance, чтобы определить, происходит ли он в определенном временном интервале.

class EventInstance < ApplicationRecord
  belongs_to :event

  # Event starts between 12am and 10am
  scope :morning, -> { where(start_time: (event.start_time.midnight...event.start_time.change(hour: 10)) ) }

  def event_name
    # This works
    event.name
  end

end

Извините за мое невежество, поскольку я не совсем разбираюсь в магии Rails.Почему я могу получить доступ к event внутри event_name, но не внутри области?Есть ли способ сделать это?

1 Ответ

0 голосов
/ 03 октября 2018

В соответствии с документами определение области действия "точно такое же, как определение метода класса".Вы можете сделать то же самое, выполнив:

class EventInstance < ApplicationRecord
  belongs_to :event

  # Event starts between 12am and 10am
  def self.morning
    where(start_time: (event.start_time.midnight...event.start_time.change(hour: 10)) )
  end

  def event_name
    # This works
    event.name
  end

end

Или даже:

class EventInstance < ApplicationRecord
  belongs_to :event

  class << self 

    # Event starts between 12am and 10am
    def morning
      where(start_time: (event.start_time.midnight...event.start_time.change(hour: 10)) )
    end

  end

  def event_name
    # This works
    event.name
  end

end

Во всех этих случаях вы не можете вызвать метод для экземпляра EventInstance, потому чтоНу, это пример, а не класс.

Я думаю, вы могли бы сделать что-то вроде:

class EventInstance < ApplicationRecord
  belongs_to :event

  delegate :start_time, to: :event

  # Event starts between 12am and 10am
  def in_morning?
    start_time.in?(start_time.midnight...start_time.change(hour: 10))
  end

  def event_name
    # This works
    event.name
  end

end

Чтобы определить, происходит ли экземпляр EventInstance между 12:00 и 10:00. * 10101

Я также отмечу, что Jörg W Mittag хотел бы сказать:

Я один из тех Ruby Purists, которому нравится указывать, что в Ruby не существует такого понятия, как метод класса.Тем не менее, я в полном порядке, используя термин метод класса в разговорной речи, , пока все стороны полностью понимают, что речь идет о разговорной речи .Другими словами, если вы знаете , что не существует такой вещи, как метод класса, и что термин «метод класса» просто сокращен от «метод экземпляра синглтон-класса объекта, который является экземпляромClass ", тогда проблем нет.Но в остальном я только видел, как это мешает пониманию.

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

...