diff options
Diffstat (limited to 'activerecord')
5 files changed, 18 insertions, 5 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 6506cd4c02..4488524c4e 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -749,7 +749,7 @@ *Johannes Opper* -* Introduce `ActiveRecord::TransactionSerializationError` for catching +* Introduce new Active Record transaction error classes for catching transaction serialization failures or deadlocks. *Erol Fornoles* diff --git a/activerecord/lib/active_record/associations/belongs_to_association.rb b/activerecord/lib/active_record/associations/belongs_to_association.rb index 4a4f88bb94..a2432e389a 100644 --- a/activerecord/lib/active_record/associations/belongs_to_association.rb +++ b/activerecord/lib/active_record/associations/belongs_to_association.rb @@ -21,8 +21,8 @@ module ActiveRecord self.target = record end - def default(record) - writer(record) if reader.nil? + def default(&block) + writer(instance_exec(&block)) if reader.nil? end def reset diff --git a/activerecord/lib/active_record/associations/builder/belongs_to.rb b/activerecord/lib/active_record/associations/builder/belongs_to.rb index 50a1c39ccf..2b9dd8aae8 100644 --- a/activerecord/lib/active_record/associations/builder/belongs_to.rb +++ b/activerecord/lib/active_record/associations/builder/belongs_to.rb @@ -121,7 +121,7 @@ module ActiveRecord::Associations::Builder # :nodoc: def self.add_default_callbacks(model, reflection) model.before_validation lambda { |o| - o.association(reflection.name).default o.instance_exec(&reflection.options[:default]) + o.association(reflection.name).default(&reflection.options[:default]) } end diff --git a/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb b/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb index e5a24b2aca..6019e05c4c 100644 --- a/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb +++ b/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb @@ -155,7 +155,11 @@ module ActiveRecord private def type_casted_binds(binds) - binds.map { |attr| type_cast(attr.value_for_database) } + if binds.first.is_a?(Array) + binds.map { |column, value| type_cast(value, column) } + else + binds.map { |attr| type_cast(attr.value_for_database) } + end end def id_value_for_database(value) diff --git a/activerecord/test/cases/adapter_test.rb b/activerecord/test/cases/adapter_test.rb index 070fca240f..601d575c0e 100644 --- a/activerecord/test/cases/adapter_test.rb +++ b/activerecord/test/cases/adapter_test.rb @@ -216,6 +216,15 @@ module ActiveRecord assert result.is_a?(ActiveRecord::Result) end + if ActiveRecord::Base.connection.prepared_statements + def test_select_all_with_legacy_binds + post = Post.create!(title: "foo", body: "bar") + expected = @connection.select_all("SELECT * FROM posts WHERE id = #{post.id}") + result = @connection.select_all("SELECT * FROM posts WHERE id = #{Arel::Nodes::BindParam.new.to_sql}", nil, [[nil, post.id]]) + assert_equal expected.to_hash, result.to_hash + end + end + def test_select_methods_passing_a_association_relation author = Author.create!(name: "john") Post.create!(author: author, title: "foo", body: "bar") |