summaryrefslogtreecommitdiff
path: root/app/models/concerns/milestoneable.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/concerns/milestoneable.rb')
-rw-r--r--app/models/concerns/milestoneable.rb23
1 files changed, 15 insertions, 8 deletions
diff --git a/app/models/concerns/milestoneable.rb b/app/models/concerns/milestoneable.rb
index a95bed7ad42..e95a8a42aa6 100644
--- a/app/models/concerns/milestoneable.rb
+++ b/app/models/concerns/milestoneable.rb
@@ -9,6 +9,12 @@
module Milestoneable
extend ActiveSupport::Concern
+ class_methods do
+ def milestone_releases_subquery
+ Milestone.joins(:releases).where("#{table_name}.milestone_id = milestones.id")
+ end
+ end
+
included do
belongs_to :milestone
@@ -17,9 +23,15 @@ module Milestoneable
scope :any_milestone, -> { where.not(milestone_id: nil) }
scope :with_milestone, ->(title) { left_joins_milestones.where(milestones: { title: title }) }
scope :without_particular_milestones, ->(titles) { left_outer_joins(:milestone).where("milestones.title NOT IN (?) OR milestone_id IS NULL", titles) }
- scope :any_release, -> { joins_milestone_releases }
- scope :with_release, -> (tag, project_id) { joins_milestone_releases.where(milestones: { releases: { tag: tag, project_id: project_id } }) }
- scope :without_particular_release, -> (tag, project_id) { joins_milestone_releases.where.not(milestones: { releases: { tag: tag, project_id: project_id } }) }
+ scope :any_release, -> do
+ where("EXISTS (?)", milestone_releases_subquery)
+ end
+ scope :with_release, -> (tag, project_id) do
+ where("EXISTS (?)", milestone_releases_subquery.where(releases: { tag: tag, project_id: project_id }))
+ end
+ scope :without_particular_release, -> (tag, project_id) do
+ where("EXISTS (?)", milestone_releases_subquery.where.not(releases: { tag: tag, project_id: project_id }))
+ end
scope :left_joins_milestones, -> { joins("LEFT OUTER JOIN milestones ON #{table_name}.milestone_id = milestones.id") }
scope :order_milestone_due_desc, -> { left_joins_milestones.reorder(Arel.sql('milestones.due_date IS NULL, milestones.id IS NULL, milestones.due_date DESC')) }
@@ -30,11 +42,6 @@ module Milestoneable
.where(milestone_releases: { release_id: nil })
end
- scope :joins_milestone_releases, -> do
- joins("JOIN milestone_releases ON #{table_name}.milestone_id = milestone_releases.milestone_id
- JOIN releases ON milestone_releases.release_id = releases.id").distinct
- end
-
private
def milestone_is_valid