From 3024d49dd29116c7416377b22f179b3ccc0618d8 Mon Sep 17 00:00:00 2001 From: Vlad Faust Date: Mon, 16 Oct 2017 22:19:54 +0300 Subject: [PATCH] feat: PG::Numeric to Float64 field converter --- spec/migration.sql | 6 ++++ spec/model/converters/db/pg/numeric_spec.cr | 24 +++++++++++++++ src/core/model/converters/db/pg/numeric.cr | 34 +++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 spec/model/converters/db/pg/numeric_spec.cr create mode 100644 src/core/model/converters/db/pg/numeric.cr diff --git a/spec/migration.sql b/spec/migration.sql index 0d8d91d..c8a6248 100644 --- a/spec/migration.sql +++ b/spec/migration.sql @@ -2,6 +2,7 @@ DROP TABLE IF EXISTS posts; DROP TABLE IF EXISTS users; +DROP TABLE IF EXISTS pg_numeric_model; CREATE TABLE users( id SERIAL PRIMARY KEY, @@ -20,3 +21,8 @@ CREATE TABLE posts( created_at TIMESTAMPTZ NOT NULL, updated_at TIMESTAMPTZ ); + +CREATE TABLE pg_numeric_model( + id SERIAL PRIMARY KEY, + a_number NUMERIC(16, 8) +) diff --git a/spec/model/converters/db/pg/numeric_spec.cr b/spec/model/converters/db/pg/numeric_spec.cr new file mode 100644 index 0000000..c850f48 --- /dev/null +++ b/spec/model/converters/db/pg/numeric_spec.cr @@ -0,0 +1,24 @@ +require "../../../../spec_helper" +require "../../../../../src/core/model/converters/db/pg/numeric" + +require "pg" + +db = DB.open(ENV["DATABASE_URL"] || raise "No DATABASE_URL is set!") +query_logger = Core::QueryLogger.new(nil) +repo = Repo.new(db, query_logger) + +class PGNumericModel < Core::Model + schema do + table_name "pg_numeric_model" + primary_key :id + field :a_number, Float64, db_converter: Converters::DB::PG::Numeric + end +end + +describe Core::Model::Converters::DB::PG::Numeric do + repo.insert(PGNumericModel.new(a_number: 42.0)) + + it do + repo.query(Query(PGNumericModel).all).first.a_number.should be_a(Float64) + end +end diff --git a/src/core/model/converters/db/pg/numeric.cr b/src/core/model/converters/db/pg/numeric.cr new file mode 100644 index 0000000..0d86f7b --- /dev/null +++ b/src/core/model/converters/db/pg/numeric.cr @@ -0,0 +1,34 @@ +require "../converter" +require "pg/numeric" + +module Core + abstract class Model + module Converters::DB + # Allows to represent `PG::Numeric` values as `Float64`s in `Model`s. + # + # ``` + # # SQL: + # # table users + # # column balance NUMERIC(16, 8) + # + # require "core/model/converters/db/pg/numeric" + # + # class User < Core::Model + # schema do + # field :balance, Float64, db_converter: Converters::DB::PG::Numeric + # end + # end + # + # user = repository.query(Query(User).last).first + # user.balance # => 42.0 + # ``` + module PG + class Numeric < Converter(::PG::Numeric) + def self.from_rs(rs) + rs.read(::PG::Numeric | Nil).try &.to_f64 + end + end + end + end + end +end