在我的軌道4,5的項目,我有以下表 紅寶石複雜的查詢優雅的解決方案
在這種SO question,我搜索了一個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
雖然查詢是正確的,但收到的結果已被很好地過濾,I f ind這個解決方案可怕並且不夠優雅。
有什麼辦法可以得到與範圍相同的結果嗎?
感謝您的幫助。
你的方法真的很優雅,主要問題是 'nil:NilClass'的undefined方法'項目'如果請求沒有返回結果(對於這個狀態) – bmichotte