ApplicationRecord(访问范围内的模型父级)

识字粗堪供赋役,不须辛苦慕公卿。这篇文章主要讲述ApplicationRecord:访问范围内的模型父级相关的知识,希望能为你提供帮助。
【ApplicationRecord(访问范围内的模型父级)】我在理解范围以及何时可以在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 endend

请原谅我的无知,因为我没有完全掌握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)) ) enddef event_name # This works event.name endend

甚至:
class EventInstance < ApplicationRecord belongs_to :eventclass < < self # Event starts between 12am and 10am def morning where(start_time: (event.start_time.midnight...event.start_time.change(hour: 10)) ) endenddef event_name # This works event.name endend

在所有这些情况下,你不能在EventInstance的实例上调用该方法,因为它是一个实例而不是一个类。
我想你可以这样做:
class EventInstance < ApplicationRecord belongs_to :eventdelegate :start_time, to: :event# Event starts between 12am and 10am def in_morning? start_time.in?(start_time.midnight...start_time.change(hour: 10)) enddef event_name # This works event.name endend

确定EventInstance的实例是否发生在上午12点到10点之间。
我还要注意到J?rg W Mittag希望说:
我是Ruby Purists之一,他们喜欢指出Ruby中没有类方法。但是,我完全没问题,通俗地使用术语类方法,只要所有各方都完全理解它是口语用法。换句话说,如果你知道没有类方法这样的东西,并且术语“类方法”只是“作为Class实例的对象的单例类的实例方法”的缩写,那么就有了没问题。但除此之外,我只看到它阻碍理解。
让所有各方充分理解术语类方法在其口语意义上的使用。

    推荐阅读