aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2016-03-08 11:46:11 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2016-07-30 15:28:33 +0900
commit411e4597d552aa091cfe3dc76a83bdaffe02da1a (patch)
treea7c06d6df27915249734789f7f995b55f17e79e6 /activerecord/lib
parent815b730b1b79158511f9f4c8465c476b9fe9b7e0 (diff)
downloadrails-411e4597d552aa091cfe3dc76a83bdaffe02da1a.tar.gz
rails-411e4597d552aa091cfe3dc76a83bdaffe02da1a.tar.bz2
rails-411e4597d552aa091cfe3dc76a83bdaffe02da1a.zip
Preserve readonly flag only for readonly association
Fixes #24093
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/associations/join_dependency.rb4
-rw-r--r--activerecord/lib/active_record/associations/preloader/association.rb2
-rw-r--r--activerecord/lib/active_record/reflection.rb4
3 files changed, 8 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/associations/join_dependency.rb b/activerecord/lib/active_record/associations/join_dependency.rb
index 491152bbcb..e6001be39c 100644
--- a/activerecord/lib/active_record/associations/join_dependency.rb
+++ b/activerecord/lib/active_record/associations/join_dependency.rb
@@ -274,7 +274,9 @@ module ActiveRecord
construct(model, node, row, rs, seen, model_cache, aliases)
else
model = construct_model(ar_parent, node, row, model_cache, id, aliases)
- model.readonly!
+ if node.reflection.scope_for(node.base_klass).readonly_value
+ model.readonly!
+ end
seen[ar_parent.object_id][node.base_klass][id] = model
construct(model, node, row, rs, seen, model_cache, aliases)
end
diff --git a/activerecord/lib/active_record/associations/preloader/association.rb b/activerecord/lib/active_record/associations/preloader/association.rb
index 3032bc786e..f7b9aa7785 100644
--- a/activerecord/lib/active_record/associations/preloader/association.rb
+++ b/activerecord/lib/active_record/associations/preloader/association.rb
@@ -113,7 +113,7 @@ module ActiveRecord
end
def reflection_scope
- @reflection_scope ||= reflection.scope ? klass.unscoped.instance_exec(nil, &reflection.scope) : klass.unscoped
+ @reflection_scope ||= reflection.scope_for(klass)
end
def build_scope
diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb
index bf398b0d40..18428d49e8 100644
--- a/activerecord/lib/active_record/reflection.rb
+++ b/activerecord/lib/active_record/reflection.rb
@@ -311,6 +311,10 @@ module ActiveRecord
active_record == other_aggregation.active_record
end
+ def scope_for(klass)
+ scope ? klass.unscoped.instance_exec(nil, &scope) : klass.unscoped
+ end
+
private
def derive_class_name
name.to_s.camelize