我想在我自己的班级中模仿ActiveRecord::Relation
的渲染行为。具体来说,当您实例化ActiveRecord::Relation
时,它实际上并不执行基础查询,直到它被呈现:
<%= my_relation %>
我想Rails可能会调用my_relation.inspect
来执行查询,但该方法并不会返回所有数据。
我需要为自定义类定义哪些方法,以便在必要时才执行基础计算?
答案 0 :(得分:0)
我认为您要定义/覆盖#each
或委托#each
。
但是,您也可以使用定义/覆盖#to_s
。
<%= my_relation %>
我不认为你的例子会做很多与ActiveRecord :: Relation加载记录有关的事情。 ERb会将my_relation
对象转换为不加载记录的字符串(#to_s
)。
请注意,在这种情况下,您可以覆盖#to_s
方法(或委托它),以便它在对象上执行您喜欢的任何操作。
我认为你可能指的是:
<%= render my_relation %>
如果不挖掘太多代码,我会怀疑#each
上正在调用my_relation
。
ActiveRecord::Relation
个实例将#each
委托给:records
。 (source)
我们还可以看到#records
依次调用#load
。 (source)
您可以按照此模式,使用#each
来懒惰或按需执行操作。