2015-07-14 4 views
1

У меня есть sql запрос с несколькими слева присоединяется, который работает отлично:Преобразование SQL-запрос к Rails ActiveRecord запроса

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 запрос и получить тот же результат?

ответ

0

Вы можете использовать Scuttle.io, первый результат всегда ужасен, но попробуйте настроить ассоциации во второй вкладке. И старайтесь избегать таких конструкций:

where("params.id = #{param[:id]}") 

небезопасный (sql injection)!

+0

Спасибо за вашу помощь, это не сработало для меня. 'Task.joins (: билеты, установки:: administrator_areas ...)' именно то, что я хочу преобразовать запрос. – CallmeSurge

+0

Попробуйте использовать .to_sql в представлении запроса ActiveRecord и сравнить со старым оператором SQL ... –

Смежные вопросы