【发布时间】:2015-07-14 14:29:34
【问题描述】:
我有一个 sql 查询,其中有多个可以正常工作的左连接:
query = <<-eos
select date(t.completed_at) completed_date, s.id district, assignee_id, u.first_name, u.last_name, count(t.id) completed_tasks
from tasks t
left join tickets k on k.id = t.ticket_id
left join installations i on i.id = k.installation_id
left join administrative_areas a on i.ward_id = a.id
left join service_areas s on s.id = a.service_district_id
left join users u on u.id = t.assignee_id
where 1 = 1
and s.id = '#{district_id}'
and t.status = '#{status}'
and t.kind = 1
and t.completed_at >= '#{days_ago.days.ago.beginning_of_day.to_s(:db)}'
and t.completed_at <= '#{days_until.days.ago.beginning_of_day.to_s(:db)}'
group by date(t.completed_at), s.id, s.name, u.first_name, u.last_name, t.assignee_id
eos
映射后我得到了这个值:[{:completed_date=>"2015-07-11", :district=>"1339", :assignee_id=>"215371", :assignee_name=>nil, :first_name=>"John_9", :last_name=>"Ant", :completed_tasks=>"1"}] 用于sql 查询。
但我想停止使用 sql 查询并切换到 ActiveRecord 查询,然后我将其转换为 ActiveRecord,如下所示:
Task.joins("LEFT JOIN tickets k ON k.id = tasks.ticket_id").
joins("LEFT JOIN installations i ON i.id = k.installation_id").
joins("LEFT JOIN administrative_areas a ON i.ward_id = a.id").
joins("LEFT JOIN service_areas s ON s.id = a.service_district_id").
joins("LEFT JOIN users u ON u.id = tasks.assignee_id").
where(["s.id = ? and tasks.status = ? and tasks.kind = ? and tasks.completed_at >= ? and tasks.completed_at <= ?", 26, "#{status}", 1, "#{days_ago.days.ago.beginning_of_day.to_s(:db)}", "#{days_until.days.ago.beginning_of_day.to_s(:db)}"]).
select('date(tasks.completed_at) as completed_date, s.id as district, assignee_id, u.first_name, u.last_name, count(tasks.id) as completed_tasks').
group("date(tasks.completed_at), s.id, s.name, u.first_name, u.last_name, tasks.assignee_id")
但我在这里遇到的问题是尝试从不同表中的多个列中执行select,ActiveRecord 查询返回的唯一值仅属于任务表。不知道哪里做错了,可能是left joins或者select
[#<Task status: 1, assignee_id: 215356, kind: 1>]
请问,如何将上述sql 查询转换为ActiveRecord 查询并获得相同的结果?
【问题讨论】:
标签: mysql sql ruby-on-rails activerecord