aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorYves Senn <yves.senn@gmail.com>2014-06-22 14:48:28 +0200
committerYves Senn <yves.senn@gmail.com>2014-06-25 13:46:54 +0200
commit5706d290b0a2501a713fadfb76d9e45c24d26e6a (patch)
tree34123891c234cf54329f11d0e5a2e57626b801d8 /activerecord
parent48933542ab4b83bab9ae5422bd95fd78abee79fa (diff)
downloadrails-5706d290b0a2501a713fadfb76d9e45c24d26e6a.tar.gz
rails-5706d290b0a2501a713fadfb76d9e45c24d26e6a.tar.bz2
rails-5706d290b0a2501a713fadfb76d9e45c24d26e6a.zip
`preload` preserves readonly flag on associations. #15853
This is a partial fix for #15853. It only works when a `preload` is issued and not an `eager_load`. I've added a skipped failing test-case to keep in mind that we need to deal with `eager_load`.
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/CHANGELOG.md6
-rw-r--r--activerecord/lib/active_record/associations/preloader/association.rb4
-rw-r--r--activerecord/test/cases/associations/eager_test.rb29
3 files changed, 39 insertions, 0 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index 6fc770d293..8f78f31f0a 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,3 +1,9 @@
+* `preload` preserves readonly flag for associations.
+
+ See #15853.
+
+ *Yves Senn*
+
* Assume numeric types have changed if they were assigned to a value that
would fail numericality validation, regardless of the old value. Previously
this would only occur if the old value was 0.
diff --git a/activerecord/lib/active_record/associations/preloader/association.rb b/activerecord/lib/active_record/associations/preloader/association.rb
index 441768f302..c0639742be 100644
--- a/activerecord/lib/active_record/associations/preloader/association.rb
+++ b/activerecord/lib/active_record/associations/preloader/association.rb
@@ -151,6 +151,10 @@ module ActiveRecord
end
end
+ if preload_values[:readonly] || values[:readonly]
+ scope.readonly!
+ end
+
if options[:as]
scope.where!(klass.table_name => { reflection.type => model.base_class.sti_name })
end
diff --git a/activerecord/test/cases/associations/eager_test.rb b/activerecord/test/cases/associations/eager_test.rb
index 910067666a..21912fdf0f 100644
--- a/activerecord/test/cases/associations/eager_test.rb
+++ b/activerecord/test/cases/associations/eager_test.rb
@@ -1261,4 +1261,33 @@ class EagerAssociationTest < ActiveRecord::TestCase
Author.eager_load(:posts_with_signature).to_a
end
end
+
+ test "preloading readonly association" do
+ # has-one
+ firm = Firm.where(id: "1").preload(:readonly_account).first!
+ assert firm.readonly_account.readonly?
+
+ # has_and_belongs_to_many
+ project = Project.where(id: "2").preload(:readonly_developers).first!
+ assert project.readonly_developers.first.readonly?
+
+ # has-many :through
+ david = Author.where(id: "1").preload(:readonly_comments).first!
+ assert david.readonly_comments.first.readonly?
+ end
+
+ test "eager-loading readonly association" do
+ skip "eager_load does not yet preserve readonly associations"
+ # has-one
+ firm = Firm.where(id: "1").eager_load(:readonly_account).first!
+ assert firm.readonly_account.readonly?
+
+ # has_and_belongs_to_many
+ project = Project.where(id: "2").eager_load(:readonly_developers).first!
+ assert project.readonly_developers.first.readonly?
+
+ # has-many :through
+ david = Author.where(id: "1").eager_load(:readonly_comments).first!
+ assert david.readonly_comments.first.readonly?
+ end
end