在我的Rails 4项目中,我有以下的表格:
在这个SO问题中,我搜索了一个SQL查询来获取实际项目状态ID = XX的项目。 这里的“实际”是指具有最大(created_at)的那个。
我得到了一个答案,这是我的查询:
select p.* from projects p
left join projects_status_projects psp on (psp.project_id = p.id)
where created_at = (select max(created_at) from projects_status_projects
where project_id = p.id)
and project_status_id = XX
我的模型已经定义。
class Project < ActiveRecord::Base
has_many :projects_status_projects
has_many :projects_statuses, :through => :projects_status_projects
end
class ProjectStatus < ActiveRecord::Base
has_many :projects_status_projects
has_many :projects, :through => :projects_status_projects
end
class ProjectsStatusType < ActiveRecord::Base
belongs_to :project
belongs_to :project_status
end
在我的项目模型中,我有以下方法。
def self.with_status(status)
joins(:projects_status_projects)
.where('projects_status_projects.created_at = (select max(created_at) from
projects_status_projects where project_id = p.id)')
.where('projects_status_projects.project_status_id = ?', status)
end
虽然查询是正确的,收到的结果也经过了很好的过滤,但我认为这种解决方案非常糟糕,并不优雅。
是否有任何使用范围(scope)可以获得相同结果的方法?
谢谢您的帮助。