ApplicationRecord:在范围内访问模型父级

时间:2018-10-02 23:30:39

标签: ruby-on-rails ruby-on-rails-5 rails-activerecord

我在理解范围以及在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 :(得分:1)

根据docs,定义范围“与定义类方法完全相同”。您可以通过执行以下操作来完成同一件事:

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点到上午10点之间发生。

我还要指出,Jörg W Mittag希望说:

  

我是那些想要指出Ruby中没有类方法之类的Ruby Purists的人之一。不过,我很好地使用了 class方法这个术语,只要各方都完全理解这是一个俗语用法。换句话说,如果您知道,就没有类方法之类的东西,并且术语“类方法”只是“作为实例的对象的单例类的实例方法”的简称的Class”,那么就没有问题。但是否则,我只会看到它妨碍理解。

让所有各方都完全理解,术语“ <类>类方法” 在上面用的是口语含义。