私のレール4プロジェクトでは、次のテーブルがあります
このSO questionでは、SQL クエリを検索して、実際のプロジェクト ステータス ID = XXのプロジェクトを取得しました。実際には、max(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
クエリは正しいですが、受信した結果は適切にフィルタリングされていますが、このソリューションはひどいものであり、まったくエレガントではありません。
スコープで同じ結果を得る方法はありますか?
ご協力いただきありがとうございます。