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

问题描述 投票:0回答:1

我在理解范围以及何时可以在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,但不在范围内?有没有办法做到这一点?

ruby-on-rails ruby-on-rails-5 rails-activerecord
1个回答
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 Purists之一,他们喜欢指出Ruby中没有类方法。但是,我完全没问题,通俗地使用术语类方法,只要所有各方都完全理解它是口语用法。换句话说,如果你知道没有类方法这样的东西,并且术语“类方法”只是“作为Class实例的对象的单例类的实例方法”的缩写,那么就有了没问题。但除此之外,我只看到它阻碍理解。

让所有各方充分理解术语类方法在其口语意义上的使用。

© www.soinside.com 2019 - 2024. All rights reserved.