当前位置: 首页 > 面试题库 >

ARel模拟包含find_by_sql

鲜于璞瑜
2023-03-14
问题内容

我有一个相当复杂的SQL查询,我敢肯定我无法使用ARel(Rails
3.0.10)完成

看看链接,但是它有一些联接和一个where exists子句,而且我敢肯定对于ARel来说太复杂了。

但是我的问题是,在此查询如此复杂之前,我可以使用ARelincludes添加其他模型来避免n +
1问题。现在,我正在使用find_by_sql,includes请不要使用。我仍然希望能够获取这些记录并将它们附加到我的模型实例includes上,但是确实不知道如何实现。

有人可以指出我正确的方向吗?

我还没有尝试将它们加入同一查询中。我只是不确定如何将它们映射到对象(即ActiveRecord是否可以将它们正确映射到适当的类)

我知道使用includesActiveRecord时实际上会进行第二次查询,然后以某种方式将这些行附加到原始查询的相应实例中。有人可以指导我如何做吗?还是我需要加入相同的查询?


问题答案:

让我们假装SQL确实不能简化为Arel。并非一切都可以,而且我们碰巧真的想保留自定义的find_by_sql,但我们也想使用include。

然后preload_associations是您的朋友:(已针对Rails 3.1更新)

class Person
  def self.custom_query
    friends_and_family = find_by_sql("SELECT * FROM people")
# Rails 3.0 and lower use this: 
#        preload_associations(friends_and_family, [:car, :kids])
# Rails 3.1 and higher use this: 
    ActiveRecord::Associations::Preloader.new(friends_and_family, [:car, :kids]).run
    friends_and_family
  end
end

请注意,3.1方法要好得多,b / c您可以随时应用eager-
loading。因此,您可以在控制器中获取对象,然后在呈现之前,可以检查格式并渴望加载更多关联。对我来说,这就是发生的事情-
html不需要急切的加载,但是.json却需要。

这种帮助?



 类似资料:
  • 问题内容: 我为Presenter编写了单元测试,这需要模拟 本地数据源 。 这是我的简单测试: 当我运行此测试时,出现错误, 当我解决更改班级的方法时,我发现有些奇怪。 下面我发现: 我尝试删除包含对象参数的构造函数和setter方法,并且可以使用! 我尝试在setter方法中更改初始化,但这种方法无效! 问题是我需要类的实例。 任何想法?谢谢 问题答案: ✔答案 几个小时后,我正在寻找解决方案

  • 6.3 模版包含 这个标签允许你引入另一个模板的内容,标签的参数是你想引入的模板的名字,名字可以是变量, 也可以是单引号或双引号表示的string 下面两个例子引入了模板nav.tpl的内容,这表示单引号和双引号都是允许的: {% include 'nav.tpl' %} {% include "nav.tpl" %} 下面的例子引入了includes/nav.tpl模板: {% include

  • 问题内容: 在以下情况下如何使用包含。目的是在html(部分)文件中使用标记,而不是在模板中(在指令内)定义标记。 我在这里找到了一个很棒的树指令。( 来源)原文: http //jsfiddle.net/n8dPm/ 我没有在指令中定义模板,而是尝试使用包含在内的内容。我还将Angular更新为1.2.0.rc2。更新时间:http://jsfiddle.net/aZx7B/2/ 低于错误 Ty

  • 问题内容: 我在主布局文件中有这个 我的目录结构中有header.html部分模板。 如何在我的应用程序中包含此模板?我认为angular在处理完控制器后会自动包含模板,但是它不起作用。 标头节点应替换为此文件的内容。 问题答案: 包含来自外部文件的模板/ html片段的一种方法是使用指令(doc)。 要么

  • 在angular 2中,我需要创建一个包含冗余部分的大型html模板。因此,我想创建多个html模板,并通过将它们包含在主html文件中(如angular1中的ng include)将它们放在一起 但是如何在主模板中包含子模板? 例如: - -

  • 对于多个页面包含的公共内容,可能会被封装到一个公共模板文件中。 比如左侧导航,文件位置和其他普通模板是一样的,/App1/View/Home/Nav.left.html 其他模板引用局部模板使用标签:{include:模块名称:操作名称}  //比如:{include:Public:header} 本文中引用左侧导航模板:{include:Nav:left} //两边是大括号,中间是冒号。 注:局