如何在Ruby中为模型创建延迟加载的属性?

Bla*_*man 10 ruby ruby-on-rails

我想创建一个延迟加载的属性,返回模型上的集合,我该怎么做?

我不想为此创建关联.

所以我希望它返回一个集合,如果集合尚未初始化,然后点击数据库,返回行,然后初始化它.

如果它运行一次,则无需再次运行它,因为下一页请求将重新启动.

Dav*_*ulc 21

添加实例属性(例如@my_attribute)

然后定义

def my_attribute
  @my_attribute ||= initialize_my_attribute
end
Run Code Online (Sandbox Code Playgroud)

(注意:initialize_my_attribute您实现的函数/方法将加载您想要的值.)

这是如何工作的:属性从一个nil值开始(我们没有为它分配任何东西).对象实例无法直接访问它,因为我们尚未在其上定义属性访问器.相反,我们有一个与属性具有完全相同名称的方法,因此当您调用my_object.my_attribute它时,看起来就像在实际调用对象实例的方法时访问该属性一样.

方法会发生什么?该||=短手相当于

@my_attribute = (@my_attribute || initialize_my_attribute)
Run Code Online (Sandbox Code Playgroud)

因此,如果@my_attribute已经有值,则返回该值.否则,@my_attribute获取一个值(然后返回).换句话说:该值将在@my_attribute第一次访问时加载(并且仅在第一次加载).

瞧!懒加载.