模仿活动记录关系渲染行为

时间:2017-08-02 15:32:07

标签: ruby-on-rails rails-activerecord

我想在我自己的班级中模仿ActiveRecord::Relation的渲染行为。具体来说,当您实例化ActiveRecord::Relation时,它实际上并不执行基础查询,直到它被呈现:

<%= my_relation %>

我想Rails可能会调用my_relation.inspect来执行查询,但该方法并不会返回所有数据。

我需要为自定义类定义哪些方法,以便在必要时才执行基础计算?

1 个答案:

答案 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来懒惰或按需执行操作。