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