【问题标题】:Returning computed SQL column from AR scope result从 AR 范围结果返回计算的 SQL 列
【发布时间】:2011-10-24 14:28:02
【问题描述】:

我有一个 named_scope,它根据他们在特定时间段内所做的相关“grouptask”记录的数量返回一些用户(学生)记录。

学生模型:

class Student < ActiveRecord::Base
  set_table_name "student"
  set_primary_key :sid

  has_many      :usersessions, :foreign_key => "associatedstudentsid"
  has_many      :grouptasks, :through => :usersessions

  named_scope :used_in_past, lambda {|days_ago| {
   :conditions => ['(SELECT count(*) as total_tasks FROM grouptask WHERE creatorstudentid = sid AND creationdate > ?) > 0', Date.today-days_ago] 
  }}
end

Grouptask 模型:

class Grouptask < ActiveRecord::Base
  set_table_name "grouptask"

  has_many      :usersessions, :foreign_key => "associatedgrouptaskid"
  has_many      :students, :through => :usersessions
end

我想要做的是能够从每条记录的结果中即时访问“total_tasks”列,但仅仅执行“student.total_tasks”并不能让我到达那里,我猜是因为该列不会映射到实际的 db 列,因为它是在查找时构建的。那么如何访问 AR 结果集中的这些类型的东西呢?

这个用例是一个包含学生姓名和他们创建的任务总量的表格。现在我正在通过查找在过去 X 天中创建任务的用户(通过在该时间段内查找 total_tasks > 0)然后执行一个 for-each 来遍历这些用户并计算数量再次执行该时间段内的任务。这显然会导致大量不需要执行的 SQL 调用,因为已经计算了这些总数以便首先找到帐户。

感谢您的帮助。

【问题讨论】:

  • 你能提供你的模型和关联设置吗?这个范围是在哪里定义的?

标签: sql ruby-on-rails activerecord


【解决方案1】:

我假设这是一个 rails 2 项目。所以你能不只是

class Students < ActiveRecord::Base
  ...
  named_scope :with_task_counts, lambda { |days_ago| {
    :joins => :grouptasks,
    :select => "SELECT student.*, count(grouptasks.id) as c",
    :having => "c > 0"
  }}
  ...
end

我还没有对此进行测试,但它可能会给你一个想法。

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多