Как изменить SQL-запрос с ruby ​​на запрос рельсов - PullRequest
0 голосов
/ 08 мая 2018

Кто-нибудь знает, как изменить этот sql-запрос на ruby ​​on rails? Здесь объединяются 4 таблицы и используются подзапросы, сгруппированные по и упорядоченные по.

subquery = ProjectMilestoneReportStatus
    .group('project_milestone_id')
    .select('project_milestone_id, max(created_at) as created_at')
ProjectMilestone.joins([:milestone, :project_milestone_report_statuses])
    .joins("INNER JOIN (#{subquery.to_sql}) AS grouped_status on                            
    project_milestone_report_statuses.project_milestone_id = 
    grouped_status.project_milestone_id
    and project_milestone_report_statuses.created_at = 
    grouped_status.created_at")
    .where(project_id: project_id)
    .select('milestones.id, milestones.name, 
    project_milestone_report_statuses.status,
    project_milestones.milestone_end_date, project_milestones.id as 
    project_milestone_id')
    .order('project_milestone_report_statuses.created_at DESC')

Рассматриваемые классы:

class Milestone < ActiveRecord::Base 
  has_many :project_milestones 
end 

class ProjectMilestone < ActiveRecord::Base 
  belongs_to :milestone 
  belongs_to :project 
  has_many :project_milestone_report_statuses 
end 

class ProjectMilestoneReportStatus < ApplicationRecord 
  belongs_to :project_milestone 
end 

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете выполнить необработанный запрос в ruby ​​

sql = "select milestones.id,foo.status,milestones.name,foo.created from project_statuses inner join projects on project_statuses.project_id=projects.id inner join project_milestones on project_milestones.project_id=projects.id inner join milestones on milestones.id=project_milestones.milestone_id inner join (SELECT project_milestone_id as id,status,created_at as created FROM project_milestone_report_statuses s1 WHERE created_at = (SELECT MAX(created_at)
FROM project_milestone_report_statuses s2
WHERE s1.project_milestone_id = s2.project_milestone_id) GROUP BY project_milestone_id,status,created_at) as foo on project_milestones.id=foo.id "

ActiveRecord::Base.connection.execute(sql)

Если вы не хотите выполнять необработанный запрос, сообщите мне подробно о ваших моделях и ассоциациях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...