mirror of
https://github.com/github/rails.git
synced 2026-01-29 08:18:03 -05:00
Ensure that modifying has_and_belongs_to_many actions clear the query cache. Closes #10840 [john.andrews]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8653 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
*SVN*
|
||||
|
||||
* Ensure that modifying has_and_belongs_to_many actions clear the query cache. Closes #10840 [john.andrews]
|
||||
|
||||
* Fix issue where Table#references doesn't pass a :null option to a *_type attribute for polymorphic associations. Closes #10753 [railsjitsu]
|
||||
|
||||
* Fixtures: removed support for the ancient pre-YAML file format. #10736 [John Barnette]
|
||||
|
||||
@@ -14,7 +14,7 @@ module ActiveRecord
|
||||
def create(attributes = {})
|
||||
create_record(attributes) { |record| insert_record(record) }
|
||||
end
|
||||
|
||||
|
||||
def create!(attributes = {})
|
||||
create_record(attributes) { |record| insert_record(record, true) }
|
||||
end
|
||||
@@ -80,7 +80,7 @@ module ActiveRecord
|
||||
end
|
||||
|
||||
if @reflection.options[:insert_sql]
|
||||
@owner.connection.execute(interpolate_sql(@reflection.options[:insert_sql], record))
|
||||
@owner.connection.insert(interpolate_sql(@reflection.options[:insert_sql], record))
|
||||
else
|
||||
columns = @owner.connection.columns(@reflection.options[:join_table], "#{@reflection.options[:join_table]} Columns")
|
||||
|
||||
@@ -103,7 +103,7 @@ module ActiveRecord
|
||||
"INSERT INTO #{@owner.connection.quote_table_name @reflection.options[:join_table]} (#{@owner.send(:quoted_column_names, attributes).join(', ')}) " +
|
||||
"VALUES (#{attributes.values.join(', ')})"
|
||||
|
||||
@owner.connection.execute(sql)
|
||||
@owner.connection.insert(sql)
|
||||
end
|
||||
|
||||
return true
|
||||
@@ -111,11 +111,11 @@ module ActiveRecord
|
||||
|
||||
def delete_records(records)
|
||||
if sql = @reflection.options[:delete_sql]
|
||||
records.each { |record| @owner.connection.execute(interpolate_sql(sql, record)) }
|
||||
records.each { |record| @owner.connection.delete(interpolate_sql(sql, record)) }
|
||||
else
|
||||
ids = quoted_record_ids(records)
|
||||
sql = "DELETE FROM #{@owner.connection.quote_table_name @reflection.options[:join_table]} WHERE #{@reflection.primary_key_name} = #{@owner.quoted_id} AND #{@reflection.association_foreign_key} IN (#{ids})"
|
||||
@owner.connection.execute(sql)
|
||||
@owner.connection.delete(sql)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -3,10 +3,12 @@ require 'fixtures/topic'
|
||||
require 'fixtures/reply'
|
||||
require 'fixtures/task'
|
||||
require 'fixtures/course'
|
||||
require 'fixtures/category'
|
||||
require 'fixtures/post'
|
||||
|
||||
|
||||
class QueryCacheTest < ActiveSupport::TestCase
|
||||
fixtures :tasks, :topics
|
||||
fixtures :tasks, :topics, :categories, :posts, :categories_posts
|
||||
|
||||
def test_find_queries
|
||||
assert_queries(2) { Task.find(1); Task.find(1) }
|
||||
@@ -99,6 +101,24 @@ class QueryCacheExpiryTest < ActiveSupport::TestCase
|
||||
Task.create!
|
||||
end
|
||||
end
|
||||
|
||||
def test_cache_is_expired_by_habtm_update
|
||||
ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
|
||||
ActiveRecord::Base.cache do
|
||||
c = Category.find(:first)
|
||||
p = Post.find(:first)
|
||||
p.categories << c
|
||||
end
|
||||
end
|
||||
|
||||
def test_cache_is_expired_by_habtm_delete
|
||||
ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
|
||||
ActiveRecord::Base.cache do
|
||||
c = Category.find(:first)
|
||||
p = Post.find(:first)
|
||||
p.categories.delete_all
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user