diff options
Diffstat (limited to 'app/models/concerns/milestoneable.rb')
-rw-r--r-- | app/models/concerns/milestoneable.rb | 23 |
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 |