aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/test
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2005-07-04 08:43:57 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2005-07-04 08:43:57 +0000
commit4180e57b7091f529a671199c22530058d5bb4cf7 (patch)
treee37efc25b556909641fdd715a023a7ed4317623f /activerecord/test
parent555072e8e9c4df577fbd10e8a34fa4036e31649c (diff)
downloadrails-4180e57b7091f529a671199c22530058d5bb4cf7.tar.gz
rails-4180e57b7091f529a671199c22530058d5bb4cf7.tar.bz2
rails-4180e57b7091f529a671199c22530058d5bb4cf7.zip
Added callback hooks to association collections #1549 [Florian Weber]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1653 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/test')
-rw-r--r--activerecord/test/fixtures/author.rb39
-rw-r--r--activerecord/test/fixtures/project.rb11
2 files changed, 50 insertions, 0 deletions
diff --git a/activerecord/test/fixtures/author.rb b/activerecord/test/fixtures/author.rb
index e159d38597..ea0094de39 100644
--- a/activerecord/test/fixtures/author.rb
+++ b/activerecord/test/fixtures/author.rb
@@ -1,3 +1,42 @@
class Author < ActiveRecord::Base
has_many :posts
+ has_many :posts_with_callbacks, :class_name => "Post", :before_add => :log_before_adding,
+ :after_add => :log_after_adding, :before_remove => :log_before_removing,
+ :after_remove => :log_after_removing
+ has_many :posts_with_proc_callbacks, :class_name => "Post",
+ :before_add => Proc.new {|o, r| o.post_log << "before_adding#{r.id}"},
+ :after_add => Proc.new {|o, r| o.post_log << "after_adding#{r.id}"},
+ :before_remove => Proc.new {|o, r| o.post_log << "before_removing#{r.id}"},
+ :after_remove => Proc.new {|o, r| o.post_log << "after_removing#{r.id}"}
+ has_many :posts_with_multiple_callbacks, :class_name => "Post",
+ :before_add => [:log_before_adding, Proc.new {|o, r| o.post_log << "before_adding_proc#{r.id}"}],
+ :after_add => [:log_after_adding, Proc.new {|o, r| o.post_log << "after_adding_proc#{r.id}"}]
+ has_many :unchangable_posts, :class_name => "Post", :before_add => :raise_exception, :after_add => :log_after_adding
+
+ attr_accessor :post_log
+
+ def after_initialize
+ @post_log = []
+ end
+
+ private
+ def log_before_adding(object)
+ @post_log << "before_adding#{object.id}"
+ end
+
+ def log_after_adding(object)
+ @post_log << "after_adding#{object.id}"
+ end
+
+ def log_before_removing(object)
+ @post_log << "before_removing#{object.id}"
+ end
+
+ def log_after_removing(object)
+ @post_log << "after_removing#{object.id}"
+ end
+
+ def raise_exception(object)
+ raise Exception.new("You can't add a post")
+ end
end \ No newline at end of file
diff --git a/activerecord/test/fixtures/project.rb b/activerecord/test/fixtures/project.rb
index a40aca95e4..9a13c9eead 100644
--- a/activerecord/test/fixtures/project.rb
+++ b/activerecord/test/fixtures/project.rb
@@ -3,6 +3,17 @@ class Project < ActiveRecord::Base
has_and_belongs_to_many :developers_named_david, :class_name => "Developer", :conditions => "name = 'David'", :uniq => true
has_and_belongs_to_many :salaried_developers, :class_name => "Developer", :conditions => "salary > 0"
has_and_belongs_to_many :developers_by_sql, :class_name => "Developer", :delete_sql => "DELETE FROM developers_projects WHERE project_id = \#{id} AND developer_id = \#{record.id}"
+ has_and_belongs_to_many :developers_with_callbacks, :class_name => "Developer", :before_add => Proc.new {|o, r| o.developers_log << "before_adding#{r.id}"},
+ :after_add => Proc.new {|o, r| o.developers_log << "after_adding#{r.id}"},
+ :before_remove => Proc.new {|o, r| o.developers_log << "before_removing#{r.id}"},
+ :after_remove => Proc.new {|o, r| o.developers_log << "after_removing#{r.id}"}
+
+ attr_accessor :developers_log
+
+ def after_initialize
+ @developers_log = []
+ end
+
end
class SpecialProject < Project