diff options
author | Baldinof <baldinof@gmail.com> | 2016-03-14 21:51:06 +0100 |
---|---|---|
committer | Baldinof <baldinof@gmail.com> | 2016-03-14 21:51:06 +0100 |
commit | 436caf4e8b7beb8cb61bb1045273488477841880 (patch) | |
tree | 99e0793f063507d05f71d901cb94955afcfe1660 /app/models/merge_request.rb | |
parent | e8c723543cfc4c1d905a5794a2da1bef7689d784 (diff) | |
parent | ca3fc2296f13f8dc7c89c4361b448ed46708cab7 (diff) | |
download | gitlab-ce-436caf4e8b7beb8cb61bb1045273488477841880.tar.gz |
Merge branch 'master' into fix_remove_fork_link
Diffstat (limited to 'app/models/merge_request.rb')
-rw-r--r-- | app/models/merge_request.rb | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 18ec48b57f4..b4a6731ff20 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -135,7 +135,6 @@ class MergeRequest < ActiveRecord::Base scope :by_branch, ->(branch_name) { where("(source_branch LIKE :branch) OR (target_branch LIKE :branch)", branch: branch_name) } scope :cared, ->(user) { where('assignee_id = :user OR author_id = :user', user: user.id) } scope :by_milestone, ->(milestone) { where(milestone_id: milestone) } - scope :in_projects, ->(project_ids) { where("source_project_id in (:project_ids) OR target_project_id in (:project_ids)", project_ids: project_ids) } scope :of_projects, ->(ids) { where(target_project_id: ids) } scope :from_project, ->(project) { where(source_project_id: project.id) } scope :merged, -> { with_state(:merged) } @@ -162,6 +161,24 @@ class MergeRequest < ActiveRecord::Base super("merge_requests", /(?<merge_request>\d+)/) end + # Returns all the merge requests from an ActiveRecord:Relation. + # + # This method uses a UNION as it usually operates on the result of + # ProjectsFinder#execute. PostgreSQL in particular doesn't always like queries + # using multiple sub-queries especially when combined with an OR statement. + # UNIONs on the other hand perform much better in these cases. + # + # relation - An ActiveRecord::Relation that returns a list of Projects. + # + # Returns an ActiveRecord::Relation. + def self.in_projects(relation) + source = where(source_project_id: relation).select(:id) + target = where(target_project_id: relation).select(:id) + union = Gitlab::SQL::Union.new([source, target]) + + where("merge_requests.id IN (#{union.to_sql})") + end + def to_reference(from_project = nil) reference = "#{self.class.reference_prefix}#{iid}" |