From e1173500379ab35734ac9101e58d6eff6552ef6e Mon Sep 17 00:00:00 2001 From: Pratik Naik Date: Fri, 7 Mar 2008 11:45:07 +0000 Subject: [PATCH] Add :readonly option to HasManyThrough associations. Closes #11156 [miloops] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8989 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- activerecord/CHANGELOG | 2 ++ .../associations/has_many_through_association.rb | 5 ++++- activerecord/test/cases/associations_test.rb | 5 +++++ activerecord/test/models/author.rb | 3 ++- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/activerecord/CHANGELOG b/activerecord/CHANGELOG index 2a70952b3435a..0ee92e8ba9168 100644 --- a/activerecord/CHANGELOG +++ b/activerecord/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Add :readonly option to HasManyThrough associations. #11156 [miloops] + * Improve performance on :include/:conditions/:limit queries by selectively joining in the pre-query. #9560 [dasil003] * Perf fix: Avoid the use of named block arguments. Closes #11109 [adymo] diff --git a/activerecord/lib/active_record/associations/has_many_through_association.rb b/activerecord/lib/active_record/associations/has_many_through_association.rb index 72bf693384ce3..8c10ac641b6bb 100644 --- a/activerecord/lib/active_record/associations/has_many_through_association.rb +++ b/activerecord/lib/active_record/associations/has_many_through_association.rb @@ -159,6 +159,7 @@ def find_target :order => @reflection.options[:order], :limit => @reflection.options[:limit], :group => @reflection.options[:group], + :readonly => @reflection.options[:readonly], :include => @reflection.options[:include] || @reflection.source_reflection.options[:include] ) @@ -253,7 +254,9 @@ def construct_scope :include => @reflection.options[:include], :select => construct_select, :order => @reflection.options[:order], - :limit => @reflection.options[:limit] } } + :limit => @reflection.options[:limit], + :readonly => @reflection.options[:readonly], + } } end def construct_sql diff --git a/activerecord/test/cases/associations_test.rb b/activerecord/test/cases/associations_test.rb index 89b978ad06c58..50643066b9fec 100755 --- a/activerecord/test/cases/associations_test.rb +++ b/activerecord/test/cases/associations_test.rb @@ -554,6 +554,11 @@ def test_dynamic_find_all_should_respect_readonly_access companies(:first_firm).readonly_clients.find(:all).each { |c| assert c.readonly? } end + def test_cant_save_has_many_readonly_association + authors(:david).readonly_comments.each { |c| assert_raise(ActiveRecord::ReadOnlyRecord) { c.save! } } + authors(:david).readonly_comments.each { |c| assert c.readonly? } + end + def test_triple_equality assert !(Array === Firm.find(:first).clients) assert Firm.find(:first).clients === Array diff --git a/activerecord/test/models/author.rb b/activerecord/test/models/author.rb index 593d77342ec6c..523d794fb3c1f 100644 --- a/activerecord/test/models/author.rb +++ b/activerecord/test/models/author.rb @@ -20,7 +20,8 @@ def testing_proxy_target has_many :funky_comments, :through => :posts, :source => :comments has_many :ordered_uniq_comments, :through => :posts, :source => :comments, :uniq => true, :order => 'comments.id' has_many :ordered_uniq_comments_desc, :through => :posts, :source => :comments, :uniq => true, :order => 'comments.id DESC' - + has_many :readonly_comments, :through => :posts, :source => :comments, :readonly => true + has_many :special_posts has_many :special_post_comments, :through => :special_posts, :source => :comments