提交 3f049b0b 编写于 作者: M Marcel Molina

Do not implicitly mark recordss of has_many :through as readonly but do mark...

Do not implicitly mark recordss of has_many :through as readonly but do mark habtm records as readonly (eventually only on join tables without rich attributes).

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4107 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
上级 58dd49a7
*SVN* *SVN*
* Do not implicitly mark recordss of has_many :through as readonly but do mark habtm records as readonly (eventually only on join tables without rich attributes). [Marcel Mollina Jr.]
* Fixed broken OCIAdapter #4457 [schoenm@earthlink.net] * Fixed broken OCIAdapter #4457 [schoenm@earthlink.net]
......
...@@ -41,7 +41,7 @@ def find(*args) ...@@ -41,7 +41,7 @@ def find(*args)
options[:conditions] = conditions options[:conditions] = conditions
options[:joins] = @join_sql options[:joins] = @join_sql
options[:readonly] ||= false options[:readonly] ||= !options[:joins].nil?
if options[:order] && @reflection.options[:order] if options[:order] && @reflection.options[:order]
options[:order] = "#{options[:order]}, #{@reflection.options[:order]}" options[:order] = "#{options[:order]}, #{@reflection.options[:order]}"
......
...@@ -1325,7 +1325,7 @@ def set_readonly_option!(options) #:nodoc: ...@@ -1325,7 +1325,7 @@ def set_readonly_option!(options) #:nodoc:
unless options.has_key?(:readonly) unless options.has_key?(:readonly)
if scoped?(:find, :readonly) if scoped?(:find, :readonly)
options[:readonly] = scope(:find, :readonly) options[:readonly] = scope(:find, :readonly)
elsif !options[:joins].blank? elsif !options[:joins].blank? && !options[:select]
options[:readonly] = true options[:readonly] = true
end end
end end
...@@ -2064,4 +2064,4 @@ def clone_attribute_value(reader_method, attribute_name) ...@@ -2064,4 +2064,4 @@ def clone_attribute_value(reader_method, attribute_name)
value value
end end
end end
end end
\ No newline at end of file
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
require 'fixtures/comment' require 'fixtures/comment'
require 'fixtures/developer' require 'fixtures/developer'
require 'fixtures/project' require 'fixtures/project'
require 'fixtures/reader'
require 'fixtures/person'
# Dummy class methods to test implicit association scoping. # Dummy class methods to test implicit association scoping.
def Comment.foo() find :first end def Comment.foo() find :first end
...@@ -50,19 +52,23 @@ def test_find_with_joins_option_implies_readonly ...@@ -50,19 +52,23 @@ def test_find_with_joins_option_implies_readonly
def test_habtm_find_readonly def test_habtm_find_readonly
dev = Developer.find(1) dev = Developer.find(1)
assert !dev.projects.empty? assert !dev.projects.empty?
dev.projects.each { |p| assert !p.readonly? } assert dev.projects.all?(&:readonly?)
dev.projects.find(:all) { |p| assert !p.readonly? } assert dev.projects.find(:all).all?(&:readonly?)
dev.projects.find(:all, :readonly => true) { |p| assert p.readonly? } assert dev.projects.find(:all, :readonly => true).all?(&:readonly?)
end end
def test_has_many_find_readonly def test_has_many_find_readonly
post = Post.find(1) post = Post.find(1)
assert !post.comments.empty? assert !post.comments.empty?
post.comments.each { |r| assert !r.readonly? } assert !post.comments.any?(&:readonly?)
post.comments.find(:all) { |r| assert !r.readonly? } assert !post.comments.find(:all).any?(&:readonly?)
post.comments.find(:all, :readonly => true) { |r| assert r.readonly? } assert post.comments.find(:all, :readonly => true).all?(&:readonly?)
end end
def test_has_many_with_through_is_not_implicitly_marked_readonly
assert people = Post.find(1).people
assert !people.any?(&:readonly?)
end
def test_readonly_scoping def test_readonly_scoping
Post.with_scope(:find => { :conditions => '1=1' }) do Post.with_scope(:find => { :conditions => '1=1' }) do
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册