@@ -38,7 +38,7 class VersionsController < ApplicationController | |||
|
38 | 38 | |
|
39 | 39 | @versions = @project.shared_versions.preload(:custom_values) |
|
40 | 40 | @versions += @project.rolled_up_versions.visible.preload(:custom_values) if @with_subprojects |
|
41 | @versions = @versions.uniq.sort | |
|
41 | @versions = @versions.to_a.uniq.sort | |
|
42 | 42 | unless params[:completed] |
|
43 | 43 | @completed_versions = @versions.select(&:completed?) |
|
44 | 44 | @versions -= @completed_versions |
@@ -66,7 +66,7 class IssueStatus < ActiveRecord::Base | |||
|
66 | 66 | end |
|
67 | 67 | end |
|
68 | 68 | |
|
69 |
scope. |
|
|
69 | scope.distinct.to_a.sort | |
|
70 | 70 | else |
|
71 | 71 | [] |
|
72 | 72 | end |
@@ -40,7 +40,7 class Journal < ActiveRecord::Base | |||
|
40 | 40 | :scope => preload({:issue => :project}, :user). |
|
41 | 41 | joins("LEFT OUTER JOIN #{JournalDetail.table_name} ON #{JournalDetail.table_name}.journal_id = #{Journal.table_name}.id"). |
|
42 | 42 | where("#{Journal.table_name}.journalized_type = 'Issue' AND" + |
|
43 |
" (#{JournalDetail.table_name}.prop_key = 'status_id' OR #{Journal.table_name}.notes <> '')"). |
|
|
43 | " (#{JournalDetail.table_name}.prop_key = 'status_id' OR #{Journal.table_name}.notes <> '')").distinct | |
|
44 | 44 | |
|
45 | 45 | before_create :split_private_notes |
|
46 | 46 | after_create :send_notification |
@@ -19,7 +19,7 class Member < ActiveRecord::Base | |||
|
19 | 19 | belongs_to :user |
|
20 | 20 | belongs_to :principal, :foreign_key => 'user_id' |
|
21 | 21 | has_many :member_roles, :dependent => :destroy |
|
22 |
has_many :roles, lambda { |
|
|
22 | has_many :roles, lambda { distinct }, :through => :member_roles | |
|
23 | 23 | belongs_to :project |
|
24 | 24 | |
|
25 | 25 | validates_presence_of :principal, :project |
@@ -233,11 +233,11 class Project < ActiveRecord::Base | |||
|
233 | 233 | end |
|
234 | 234 | |
|
235 | 235 | def principals |
|
236 |
@principals ||= Principal.active.joins(:members).where("#{Member.table_name}.project_id = ?", id). |
|
|
236 | @principals ||= Principal.active.joins(:members).where("#{Member.table_name}.project_id = ?", id).distinct | |
|
237 | 237 | end |
|
238 | 238 | |
|
239 | 239 | def users |
|
240 |
@users ||= User.active.joins(:members).where("#{Member.table_name}.project_id = ?", id). |
|
|
240 | @users ||= User.active.joins(:members).where("#{Member.table_name}.project_id = ?", id).distinct | |
|
241 | 241 | end |
|
242 | 242 | |
|
243 | 243 | # Returns the Systemwide and project specific activities |
@@ -437,7 +437,7 class Project < ActiveRecord::Base | |||
|
437 | 437 | joins(projects: :enabled_modules). |
|
438 | 438 | where("#{Project.table_name}.status <> ?", STATUS_ARCHIVED). |
|
439 | 439 | where(:enabled_modules => {:name => 'issue_tracking'}). |
|
440 |
|
|
|
440 | distinct. | |
|
441 | 441 | sorted |
|
442 | 442 | end |
|
443 | 443 | |
@@ -522,7 +522,7 class Project < ActiveRecord::Base | |||
|
522 | 522 | active. |
|
523 | 523 | joins(:members => :roles). |
|
524 | 524 | where(:type => types, :members => {:project_id => id}, :roles => {:assignable => true}). |
|
525 |
|
|
|
525 | distinct. | |
|
526 | 526 | sorted |
|
527 | 527 | |
|
528 | 528 | if tracker |
@@ -283,7 +283,7 class Repository < ActiveRecord::Base | |||
|
283 | 283 | |
|
284 | 284 | # Returns an array of committers usernames and associated user_id |
|
285 | 285 | def committers |
|
286 |
@committers ||= Changeset.where(:repository_id => id). |
|
|
286 | @committers ||= Changeset.where(:repository_id => id).distinct.pluck(:committer, :user_id) | |
|
287 | 287 | end |
|
288 | 288 | |
|
289 | 289 | # Maps committers username to a user ids |
@@ -66,7 +66,7 class Tracker < ActiveRecord::Base | |||
|
66 | 66 | end |
|
67 | 67 | end |
|
68 | 68 | end |
|
69 |
joins(:projects).where(condition). |
|
|
69 | joins(:projects).where(condition).distinct | |
|
70 | 70 | } |
|
71 | 71 | |
|
72 | 72 | def to_s; name end |
@@ -85,7 +85,7 class Tracker < ActiveRecord::Base | |||
|
85 | 85 | if new_record? |
|
86 | 86 | [] |
|
87 | 87 | else |
|
88 |
@issue_status_ids ||= WorkflowTransition.where(:tracker_id => id). |
|
|
88 | @issue_status_ids ||= WorkflowTransition.where(:tracker_id => id).distinct.pluck(:old_status_id, :new_status_id).flatten.uniq | |
|
89 | 89 | end |
|
90 | 90 | end |
|
91 | 91 |
@@ -140,7 +140,7 class User < Principal | |||
|
140 | 140 | scope :having_mail, lambda {|arg| |
|
141 | 141 | addresses = Array.wrap(arg).map {|a| a.to_s.downcase} |
|
142 | 142 | if addresses.any? |
|
143 |
joins(:email_addresses).where("LOWER(#{EmailAddress.table_name}.address) IN (?)", addresses). |
|
|
143 | joins(:email_addresses).where("LOWER(#{EmailAddress.table_name}.address) IN (?)", addresses).distinct | |
|
144 | 144 | else |
|
145 | 145 | none |
|
146 | 146 | end |
@@ -167,7 +167,7 module Redmine | |||
|
167 | 167 | scope. |
|
168 | 168 | reorder(searchable_options[:date_column] => :desc, :id => :desc). |
|
169 | 169 | limit(limit). |
|
170 |
|
|
|
170 | distinct. | |
|
171 | 171 | pluck(searchable_options[:date_column], :id). |
|
172 | 172 | # converts timestamps to integers for faster sort |
|
173 | 173 | map {|timestamp, id| [timestamp.to_i, id]} |
@@ -168,7 +168,7 module Redmine | |||
|
168 | 168 | joins("LEFT JOIN #{Project.table_name} child ON #{Project.table_name}.lft <= child.lft AND #{Project.table_name}.rgt >= child.rgt"). |
|
169 | 169 | where("child.id IN (?)", ids). |
|
170 | 170 | order("#{Project.table_name}.lft ASC"). |
|
171 |
|
|
|
171 | distinct. | |
|
172 | 172 | to_a |
|
173 | 173 | else |
|
174 | 174 | @projects = [] |
@@ -176,7 +176,7 module Redmine | |||
|
176 | 176 | reorder(:id).lock.ids |
|
177 | 177 | update_all(:root_id => nil, :lft => nil, :rgt => nil) |
|
178 | 178 | where(:parent_id => nil).update_all(["root_id = id, lft = ?, rgt = ?", 1, 2]) |
|
179 |
roots_with_children = joins("JOIN #{table_name} parent ON parent.id = #{table_name}.parent_id AND parent.id = parent.root_id"). |
|
|
179 | roots_with_children = joins("JOIN #{table_name} parent ON parent.id = #{table_name}.parent_id AND parent.id = parent.root_id").distinct.pluck("parent.id") | |
|
180 | 180 | roots_with_children.each do |root_id| |
|
181 | 181 | rebuild_nodes(root_id) |
|
182 | 182 | end |
@@ -172,7 +172,7 class IssuesTest < Redmine::IntegrationTest | |||
|
172 | 172 | def test_issue_with_user_custom_field |
|
173 | 173 | @field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true, :trackers => Tracker.all) |
|
174 | 174 | Role.anonymous.add_permission! :add_issues, :edit_issues |
|
175 |
users = Project.find(1).users. |
|
|
175 | users = Project.find(1).users.sort | |
|
176 | 176 | tester = users.first |
|
177 | 177 | |
|
178 | 178 | # Issue form |
@@ -242,7 +242,7 class ProjectMembersInheritanceTest < ActiveSupport::TestCase | |||
|
242 | 242 | |
|
243 | 243 | member = project.reload.memberships.detect {|m| m.principal == user} |
|
244 | 244 | assert_not_nil member |
|
245 |
assert_equal [1, 2, 3], member.roles. |
|
|
245 | assert_equal [1, 2, 3], member.roles.map(&:id).uniq.sort | |
|
246 | 246 | end |
|
247 | 247 | end |
|
248 | 248 | |
@@ -258,7 +258,7 class ProjectMembersInheritanceTest < ActiveSupport::TestCase | |||
|
258 | 258 | |
|
259 | 259 | member = project.reload.memberships.detect {|m| m.principal == user} |
|
260 | 260 | assert_not_nil member |
|
261 |
assert_equal [1, 2, 3], member.roles. |
|
|
261 | assert_equal [1, 2, 3], member.roles.map(&:id).uniq.sort | |
|
262 | 262 | end |
|
263 | 263 | end |
|
264 | 264 | end |
@@ -992,12 +992,12 class ProjectTest < ActiveSupport::TestCase | |||
|
992 | 992 | assert_include 'closed', p.css_classes.split |
|
993 | 993 | end |
|
994 | 994 | |
|
995 |
def test_combination_of_visible_and_ |
|
|
995 | def test_combination_of_visible_and_distinct_scopes_in_case_anonymous_group_has_memberships_should_not_error | |
|
996 | 996 | project = Project.find(1) |
|
997 | 997 | member = Member.create!(:project => project, :principal => Group.anonymous, :roles => [Role.generate!]) |
|
998 | 998 | project.members << member |
|
999 | 999 | assert_nothing_raised do |
|
1000 |
Project. |
|
|
1000 | Project.distinct.visible.to_a | |
|
1001 | 1001 | end |
|
1002 | 1002 | end |
|
1003 | 1003 | end |
General Comments 0
You need to be logged in to leave comments.
Login now