在我的应用程序中,我有一个复杂的数据库结构。为了为一个调用生成JSON响应,我需要从许多连接的表中获取数据。如何避免再次调用数据库当我已经拥有全部需要的SQL调用结果时
我创建了一个SQL查询,获取我需要的所有数据(使用rails'includes
)。然而,现在我认为我的结果是,我无法弄清楚什么是实际呈现它的正确方法。
一个简单的例子,不是我的实际代码:比方说,我有项目包含子项目包含任务和查询返回他们所有的一些嵌套结构,根据一些过滤逻辑。
class Project < ActiveRecord::Base
...
def with_sub_projects_visible_by(user)
includes(...complex join with sub projects and tasks...)
.where(...complex condition...)
end
end
在控制器我有这样的事情:
def show
@project_with_full_details = Project.find(params[:id]).with_sub_projects_visible_by(current_user)
end
有没有写,这将使得包含从@project_with_full_details
的所有数据,而无需再次调用数据库中的页面简洁视图代码的方法吗?从我的尝试中,只需拨打@project_with_full_details.sub_projects
并不能解决问题。它调用数据库并获取相关子项目的完整列表,而不是应该包含在查询结果中的已过滤列表。
(我使用Rabl的对我的看法,因为我渲染JSON,但它是那么重要,ERB例如将完全罚款)
只是在执行'includes(:tasks)'应该为您做好急切的加载并且只做一个连接查询来获取对象和相关的任务关联。 '包括(...复杂的加入子项目和任务...)'不会最大限度地发挥作用,如果你想用自定义查询做一个非常复杂的连接,你需要'join()'方法 – VelLes