Index: app/models/principal.rb =================================================================== --- app/models/principal.rb (revision 17212) +++ app/models/principal.rb (working copy) @@ -84,26 +84,24 @@ # Principals that are members of a collection of projects scope :member_of, lambda {|projects| - projects = [projects] if projects.is_a?(Project) - if projects.blank? - where("1=0") - else - ids = projects.map(&:id) - active.where("#{Principal.table_name}.id IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids) - end + return where('1=0') if projects.blank? + + projects = [projects] unless projects.respond_to?(:map) + ids = projects.map(&:id) + active.where("#{Principal.table_name}.id IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids) } + # Principals that are not members of projects scope :not_member_of, lambda {|projects| - projects = [projects] unless projects.is_a?(Array) - if projects.empty? - where("1=0") - else - ids = projects.map(&:id) - where("#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids) - end + return where('1=0') if projects.blank? + + projects = [projects] unless projects.respond_to?(:map) + ids = projects.map(&:id) + where("#{Principal.table_name}.id NOT IN (SELECT DISTINCT user_id FROM #{Member.table_name} WHERE project_id IN (?))", ids) } - scope :sorted, lambda { order(*Principal.fields_for_order_statement)} + scope :sorted, lambda { order(*Principal.fields_for_order_statement) } + before_create :set_default_empty_values before_destroy :nullify_projects_default_assigned_to Index: test/unit/principal_test.rb =================================================================== --- test/unit/principal_test.rb (revision 17212) +++ test/unit/principal_test.rb (working copy) @@ -60,7 +60,7 @@ end def test_member_of_scope_should_be_empty_for_no_projects - assert_equal [], Principal.member_of([]).sort + assert_equal [], Principal.member_of([]) end def test_not_member_of_scope_should_return_users_that_have_no_memberships @@ -73,9 +73,20 @@ end def test_not_member_of_scope_should_be_empty_for_no_projects - assert_equal [], Principal.not_member_of([]).sort + assert_equal [], Principal.not_member_of([]) end + def test_that_not_member_of_scope_accepts_active_record_relation + projects_relation = Project.where(:name => 'eCookbook') + projects_array = projects_relation.to_a + + assert_nothing_raised do + Principal.not_member_of(projects_relation) + end + assert_equal Principal.not_member_of(projects_array), + Principal.not_member_of(projects_relation) + end + def test_sorted_scope_should_sort_users_before_groups scope = Principal.where(:type => ['User', 'Group']) users = scope.select {|p| p.is_a?(User)}.sort