mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Make counter_cache work with polymorphic belongs_to
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3756 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
c0d2477886
commit
964b67dd0e
5 changed files with 26 additions and 13 deletions
|
@ -1,5 +1,7 @@
|
|||
*SVN*
|
||||
|
||||
* Make counter_cache work with polymorphic belongs_to [Jamis Buck]
|
||||
|
||||
* Fixed that calling HasOneProxy#build_model repeatedly would cause saving to happen #4058 [anna@wota.jp]
|
||||
|
||||
* Added Sybase database adapter that relies on the Sybase Open Client bindings (see http://raa.ruby-lang.org/project/sybase-ctlib) #3765 [John Sheets]. It's almost completely Active Record compliant, but has the following caveats:
|
||||
|
|
|
@ -506,22 +506,22 @@ module ActiveRecord
|
|||
EOF
|
||||
end
|
||||
|
||||
if options[:counter_cache]
|
||||
module_eval(
|
||||
"after_create '#{reflection.class_name}.increment_counter(\"#{self.to_s.underscore.pluralize + "_count"}\", #{reflection.primary_key_name})" +
|
||||
" unless #{reflection.name}.nil?'"
|
||||
)
|
||||
|
||||
module_eval(
|
||||
"before_destroy '#{reflection.class_name}.decrement_counter(\"#{self.to_s.underscore.pluralize + "_count"}\", #{reflection.primary_key_name})" +
|
||||
" unless #{reflection.name}.nil?'"
|
||||
)
|
||||
end
|
||||
|
||||
# deprecated api
|
||||
deprecated_has_association_method(reflection.name)
|
||||
deprecated_association_comparison_method(reflection.name, reflection.class_name)
|
||||
end
|
||||
|
||||
if options[:counter_cache]
|
||||
module_eval(
|
||||
"after_create '#{reflection.name}.class.increment_counter(\"#{self.to_s.underscore.pluralize + "_count"}\", #{reflection.primary_key_name})" +
|
||||
" unless #{reflection.name}.nil?'"
|
||||
)
|
||||
|
||||
module_eval(
|
||||
"before_destroy '#{reflection.name}.class.decrement_counter(\"#{self.to_s.underscore.pluralize + "_count"}\", #{reflection.primary_key_name})" +
|
||||
" unless #{reflection.name}.nil?'"
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
# Associates two classes via an intermediate join table. Unless the join table is explicitly specified as
|
||||
|
|
|
@ -104,4 +104,12 @@ class AssociationsJoinModelTest < Test::Unit::TestCase
|
|||
assert_equal [], posts(:thinking).authors
|
||||
assert_equal [authors(:mary)], posts(:authorless).authors
|
||||
end
|
||||
|
||||
def test_belongs_to_polymorphic_with_counter_cache
|
||||
assert_equal 0, posts(:welcome)[:taggings_count]
|
||||
tagging = posts(:welcome).taggings.create(:tag => tags(:general))
|
||||
assert_equal 1, posts(:welcome, :reload)[:taggings_count]
|
||||
tagging.destroy
|
||||
assert posts(:welcome, :reload)[:taggings_count].zero?
|
||||
end
|
||||
end
|
||||
|
|
|
@ -8,6 +8,7 @@ ActiveRecord::Schema.define do
|
|||
|
||||
create_table "tags", :force => true do |t|
|
||||
t.column "name", :string
|
||||
t.column :taggings_count, :integer, :default => 0
|
||||
end
|
||||
|
||||
create_table "categorizations", :force => true do |t|
|
||||
|
@ -16,4 +17,6 @@ ActiveRecord::Schema.define do
|
|||
t.column "author_id", :integer
|
||||
end
|
||||
|
||||
add_column :posts, :taggings_count, :integer, :default => 0
|
||||
|
||||
end
|
2
activerecord/test/fixtures/tagging.rb
vendored
2
activerecord/test/fixtures/tagging.rb
vendored
|
@ -1,4 +1,4 @@
|
|||
class Tagging < ActiveRecord::Base
|
||||
belongs_to :tag
|
||||
belongs_to :taggable, :polymorphic => true
|
||||
belongs_to :taggable, :polymorphic => true, :counter_cache => true
|
||||
end
|
Loading…
Reference in a new issue