【问题标题】:Convert SQL query to Rails ActiveRecord query将 SQL 查询转换为 Rails ActiveRecord 查询
【发布时间】: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=&gt;"2015-07-11", :district=&gt;"1339", :assignee_id=&gt;"215371", :assignee_name=&gt;nil, :first_name=&gt;"John_9", :last_name=&gt;"Ant", :completed_tasks=&gt;"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


    【解决方案1】:

    您可以使用Scuttle.io 第一个结果总是很糟糕,但尝试在第二个选项卡中配置关联。请尽量避免这样的结构:

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

    它是不安全的(sql 注入)!

    【讨论】:

    • 感谢您的帮助,这对我不起作用。 Task.joins(:tickets, installations: :administrative_areas ...) 正是我想要将查询转换为的内容。
    • 尝试在您的 ActiveRecord 查询表示上使用 .to_sql 并与旧的 SQL 语句进行比较...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多