我在理解范围以及何时可以在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
,但不在范围内?有没有办法做到这一点?
根据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
实例的对象的单例类的实例方法”的缩写,那么就有了没问题。但除此之外,我只看到它阻碍理解。
让所有各方充分理解术语类方法在其口语意义上的使用。