就效率而言,最好是这样做:
child = @user.child
foo1 = entry.foo1
foo2 = entry.foo2
或
foo1 = @user.child.foo1
foo2 = @user.child.foo2
其中@user
和Child
具有一对一关联。
这些查询究竟如何在Rails中运行,特别是ActiveRecord? Rails是否隐式地将引用保存到控制器实例中的@user.entry
,或者Rails是否会执行多个数据库查询?
其次,它是否依赖于ORM / DB?
答案 0 :(得分:1)
您的示例都会触发3个查询(如果没有#includes
)
第一次访问#child
,另外两位访问#foo1
和#foo2
。
如果在用户对象上调用N次#child
方法,它将只触发一个数据库查询,因为ActiveRecord会在您第一次请求子对象时将子对象缓存到用户对象中。
如果您正在使用PostgreSQL,MySQL,SQLite等,ActiveRecord的行为将相同。 但其他ORM可能无法以这种方式实现。