我在理解范围以及在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
,但不能在范围内访问?有什么办法吗?
答案 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
”,那么就没有问题。但是否则,我只会看到它妨碍理解。
让所有各方都完全理解,术语“ <类>类方法” 在上面用的是口语含义。