From 433ab9e8e3dbe62149b7535cee5e2a3b7ed32bda Mon Sep 17 00:00:00 2001 From: Netto Farah Date: Fri, 18 Nov 2016 10:29:56 -0800 Subject: [PATCH] Add support to serialized fields with AR 5 (#43) --- Appraisals | 4 ++++ gemfiles/rails50.gemfile | 7 +++++++ lib/polo/sql_translator.rb | 24 ++++++++++++++++++++++-- spec/polo_spec.rb | 2 +- 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 gemfiles/rails50.gemfile diff --git a/Appraisals b/Appraisals index dbb7192..6797494 100644 --- a/Appraisals +++ b/Appraisals @@ -13,3 +13,7 @@ end appraise "rails42" do gem "activerecord", "4.2.3" end + +appraise "rails50" do + gem "activerecord", "5.0.0" +end diff --git a/gemfiles/rails50.gemfile b/gemfiles/rails50.gemfile new file mode 100644 index 0000000..e1ce772 --- /dev/null +++ b/gemfiles/rails50.gemfile @@ -0,0 +1,7 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "activerecord", "5.0.0" + +gemspec :path => "../" diff --git a/lib/polo/sql_translator.rb b/lib/polo/sql_translator.rb index efd2a41..6766888 100644 --- a/lib/polo/sql_translator.rb +++ b/lib/polo/sql_translator.rb @@ -69,7 +69,8 @@ def insert_values(record) # wouldn't be properly serialized automatically. That's why explict # 'type_cast' call are necessary. # - module ActiveRecordFourOrGreater + module ActiveRecordFour + def insert_values(record) connection = ActiveRecord::Base.connection values = record.send(:arel_attributes_with_values_for_create, record.attribute_names) @@ -80,10 +81,29 @@ def insert_values(record) end end + # Internal: Returns an object's attribute definitions along with + # their set values (for Rails >= 5.x). + # + # Serializers have changed again in rails 5. + # We now use the type_caster from the arel_table. + # + module ActiveRecordFive + def insert_values(record) + type_caster = record.class.arel_table.send(:type_caster) + values = record.send(:arel_attributes_with_values_for_create, record.attribute_names) + values.each do |attribute, value| + values[attribute] = type_caster.type_cast_for_database(attribute.name, value) + end + values + end + end + if ActiveRecord::VERSION::MAJOR < 4 include ActiveRecordLessThanFour + elsif ActiveRecord::VERSION::MAJOR == 4 + include ActiveRecordFour else - include ActiveRecordFourOrGreater + include ActiveRecordFive end end end diff --git a/spec/polo_spec.rb b/spec/polo_spec.rb index 36922b9..a4001de 100644 --- a/spec/polo_spec.rb +++ b/spec/polo_spec.rb @@ -19,7 +19,7 @@ end it 'generates insert queries for dependencies' do - if ActiveRecord::VERSION::STRING.start_with?('4.2') + if ActiveRecord::VERSION::STRING >= "4.2" serialized_nil = "NULL" else serialized_nil = "'null'"