【问题标题】:ActiveRecord - How to join association with pure SQL queryActiveRecord - 如何加入与纯 SQL 查询的关联
【发布时间】:2013-04-26 19:52:55
【问题描述】:

我正在执行以下查询:

TaskCheck.find_by_sql ["SELECT task_checks.*, tasks.* FROM task_checks INNER JOIN tasks ON task_checks.task_id = tasks.id"]

它返回 TaskCheck 对象,但是当我尝试读取任务字段(加入查询)时,ActiveRecord 会为每个对象执行单独的选择查询。即使我加入它,它也会延迟加载我的协会。我该如何解决?

PS:我想使用纯 SQL。原因是因为 AR“包含”方法为关联执行了第二个 SELECT,这对于一对一关联来说是无效的,我希望获得尽可能好的性能。

【问题讨论】:

  • 如果您不使用纯 SQL,这非常简单。为什么要用纯sql?
  • 因为这部分系统每天要执行数千次,我希望尽可能获得最佳性能。
  • 我现在记得了,主要原因是因为 AR “includes” 方法为关联做了一个单独的 SELECT。这对于 Rails 和一对多关联来说是一种很好的方法,但在一对一关联中无效。

标签: sql ruby-on-rails activerecord eager-loading model-associations


【解决方案1】:

有一种方法可以让您指定所需的列,如下所示:

sql = "SELECT task_checks.*, tasks.* FROM task_checks INNER JOIN tasks ON task_checks.task_id = tasks.id"
records_array = ActiveRecord::Base.connection.execute(sql)

然后,records_array 将包含选择查询中具有指定列的所有返回行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多