bit outta the loop on patching these days, but this makes the tests run again and supports multiple (array of names) based scoping for acts_as_list cfp:~/src/git/acts_as_list > ruby test/list_test.rb |tail .-- create_table(:mixins) -> 0.0006s -- initialize_schema_migrations_table() -> 0.0005s -- assume_migrated_upto_version(1) -> 0.0002s . Finished in 0.429682 seconds. 19 tests, 103 assertions, 0 failures, 0 errors diff --git a/lib/active_record/acts/list.rb b/lib/active_record/acts/ list.rb index 00d8692..a04a62b 100644 --- a/lib/active_record/acts/list.rb +++ b/lib/active_record/acts/list.rb @@ -35,20 +35,39 @@ module ActiveRecord configuration.update(options) if options.is_a?(Hash) configuration[:scope] = "#{configuration[:scope]}_id".intern if configuration[:scope].is_a? (Symbol) && configuration[:scope].to_s !~ /_id$/ + configuration[:scope].map!{|scope| (scope.to_s.sub(/_id $/,'''') + ''_id'').intern} if configuration[:scope].is_a?(Array) + + scope_condition_method + case configuration[:scope] + when Symbol + <<-def + def scope_condition + if #{configuration[:scope].to_s}.nil? + "#{configuration[:scope].to_s} IS NULL" + else + "#{configuration[:scope].to_s} = \#{#{configuration[:scope].to_s}}" + end + end + def + + when Array + <<-def + def scope_condition + #{configuration[:scope].inspect}.map do |scope| + value = send(scope) + if value.nil? + "\#{scope} IS NULL" + else + "\#{scope} = \#{value.inspect}" + end + end.join('' AND '') + end + def + + else + "def scope_condition() \"#{configuration[:scope]}\" end" + end - if configuration[:scope].is_a?(Symbol) - scope_condition_method = %( - def scope_condition - if #{configuration[:scope].to_s}.nil? - "#{configuration[:scope].to_s} IS NULL" - else - "#{configuration[:scope].to_s} = \#{#{configuration[:scope].to_s}}" - end - end - ) - else - scope_condition_method = "def scope_condition() \"#{configuration[:scope]}\" end" - end class_eval <<-EOV include ActiveRecord::Acts::List::InstanceMethods diff --git a/test/list_test.rb b/test/list_test.rb index e89cb8e..7571b0c 100644 --- a/test/list_test.rb +++ b/test/list_test.rb @@ -4,7 +4,13 @@ require ''rubygems'' gem ''activerecord'', ''>= 1.15.4.7794'' require ''active_record'' -require "#{File.dirname(__FILE__)}/../init" +$:.unshift "#{File.dirname(__FILE__)}/../lib" + +begin + require "#{File.dirname(__FILE__)}/../init" +rescue LoadError + require "#{File.dirname(__FILE__)}/../rails/init" +end ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :dbfile => ":memory:") @@ -13,6 +19,7 @@ def setup_db create_table :mixins do |t| t.column :pos, :integer t.column :parent_id, :integer + t.column :parent2_id, :integer t.column :created_at, :datetime t.column :updated_at, :datetime end @@ -46,6 +53,13 @@ class ListWithStringScopeMixin < ActiveRecord::Base def self.table_name() "mixins" end end +class ListWithArrayScopeMixin < ActiveRecord::Base + acts_as_list :column => "pos", :scope => [:parent_id, :parent2_id] + + def self.table_name() "mixins" end +end + + class ListTest < Test::Unit::TestCase @@ -182,6 +196,18 @@ class ListTest < Test::Unit::TestCase assert new.last? end + def test_with_array_based_scope + first = ListWithArrayScopeMixin.create(:parent_id => 500, :parent2_id => 600) + assert_equal 1, first.pos + assert first.first? + assert first.last? + + last = ListWithArrayScopeMixin.create(:parent_id => 500, :parent2_id => 600) + assert_equal 2, last.pos + assert first.first? + assert last.last? + end + def test_nil_scope new1, new2, new3 = ListMixin.create, ListMixin.create, ListMixin.create new2.move_higher a @ http://codeforpeople.com/ -- we can deny everything, except that we have the possibility of being better. simply reflect on that. h.h. the 14th dalai lama --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---
> bit outta the loop on patching these days, but this makes the tests > run again and supports multiple (array of names) based scoping for > acts_as_listDo you have this in a git repository somewhere? Looks good to me but a git repostiory or git-format-patch file would make it way easier to apply.> cfp:~/src/git/acts_as_list > ruby test/list_test.rb |tail > .-- create_table(:mixins) > -> 0.0006s > -- initialize_schema_migrations_table() > -> 0.0005s > -- assume_migrated_upto_version(1) > -> 0.0002s > . > Finished in 0.429682 seconds. > > 19 tests, 103 assertions, 0 failures, 0 errors > > > > > > > > > > diff --git a/lib/active_record/acts/list.rb b/lib/active_record/acts/ > list.rb > index 00d8692..a04a62b 100644 > --- a/lib/active_record/acts/list.rb > +++ b/lib/active_record/acts/list.rb > @@ -35,20 +35,39 @@ module ActiveRecord > configuration.update(options) if options.is_a?(Hash) > > configuration[:scope] > "#{configuration[:scope]}_id".intern if configuration[:scope].is_a? > (Symbol) && configuration[:scope].to_s !~ /_id$/ > + configuration[:scope].map!{|scope| (scope.to_s.sub(/_id > $/,'''') + ''_id'').intern} if configuration[:scope].is_a?(Array) > + > + scope_condition_method > + case configuration[:scope] > + when Symbol > + <<-def > + def scope_condition > + if #{configuration[:scope].to_s}.nil? > + "#{configuration[:scope].to_s} IS NULL" > + else > + "#{configuration[:scope].to_s} > \#{#{configuration[:scope].to_s}}" > + end > + end > + def > + > + when Array > + <<-def > + def scope_condition > + #{configuration[:scope].inspect}.map do |scope| > + value = send(scope) > + if value.nil? > + "\#{scope} IS NULL" > + else > + "\#{scope} = \#{value.inspect}" > + end > + end.join('' AND '') > + end > + def > + > + else > + "def scope_condition() \"#{configuration[:scope]}\" > end" > + end > > - if configuration[:scope].is_a?(Symbol) > - scope_condition_method = %( > - def scope_condition > - if #{configuration[:scope].to_s}.nil? > - "#{configuration[:scope].to_s} IS NULL" > - else > - "#{configuration[:scope].to_s} > \#{#{configuration[:scope].to_s}}" > - end > - end > - ) > - else > - scope_condition_method = "def scope_condition() > \"#{configuration[:scope]}\" end" > - end > > class_eval <<-EOV > include ActiveRecord::Acts::List::InstanceMethods > diff --git a/test/list_test.rb b/test/list_test.rb > index e89cb8e..7571b0c 100644 > --- a/test/list_test.rb > +++ b/test/list_test.rb > @@ -4,7 +4,13 @@ require ''rubygems'' > gem ''activerecord'', ''>= 1.15.4.7794'' > require ''active_record'' > > -require "#{File.dirname(__FILE__)}/../init" > +$:.unshift "#{File.dirname(__FILE__)}/../lib" > + > +begin > + require "#{File.dirname(__FILE__)}/../init" > +rescue LoadError > + require "#{File.dirname(__FILE__)}/../rails/init" > +end > > ActiveRecord::Base.establish_connection(:adapter => > "sqlite3", :dbfile => ":memory:") > > @@ -13,6 +19,7 @@ def setup_db > create_table :mixins do |t| > t.column :pos, :integer > t.column :parent_id, :integer > + t.column :parent2_id, :integer > t.column :created_at, :datetime > t.column :updated_at, :datetime > end > @@ -46,6 +53,13 @@ class ListWithStringScopeMixin < ActiveRecord::Base > def self.table_name() "mixins" end > end > > +class ListWithArrayScopeMixin < ActiveRecord::Base > + acts_as_list :column => "pos", :scope => [:parent_id, :parent2_id] > + > + def self.table_name() "mixins" end > +end > + > + > > class ListTest < Test::Unit::TestCase > > @@ -182,6 +196,18 @@ class ListTest < Test::Unit::TestCase > assert new.last? > end > > + def test_with_array_based_scope > + first = ListWithArrayScopeMixin.create(:parent_id => > 500, :parent2_id => 600) > + assert_equal 1, first.pos > + assert first.first? > + assert first.last? > + > + last = ListWithArrayScopeMixin.create(:parent_id => > 500, :parent2_id => 600) > + assert_equal 2, last.pos > + assert first.first? > + assert last.last? > + end > + > def test_nil_scope > new1, new2, new3 = ListMixin.create, ListMixin.create, > ListMixin.create > new2.move_higher > > > > > > > a @ http://codeforpeople.com/ > -- > we can deny everything, except that we have the possibility of being > better. simply reflect on that. > h.h. the 14th dalai lama > > > > > > >-- Cheers Koz --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To post to this group, send email to rubyonrails-core@googlegroups.com To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en -~----------~----~----~----~------~----~------~--~---