From 9a2c69a649d305d42ff9fb1fe5ff8cd5c8ce0893 Mon Sep 17 00:00:00 2001 From: Matthew McGarvey Date: Fri, 18 Sep 2020 12:01:43 -0500 Subject: [PATCH] Extract PrimaryKeyQueryable from Queryable (#455) * Extract PrimaryKeyQueryable from Queryable * Switch to composition of modules than an inheritance structure * Remove abstract defs from PrimaryKeyQueryable Co-authored-by: Jeremy Woertink --- src/avram/base_query_template.cr | 1 + src/avram/primary_key_queryable.cr | 21 +++++++++++++++++++++ src/avram/queryable.cr | 16 +--------------- 3 files changed, 23 insertions(+), 15 deletions(-) create mode 100644 src/avram/primary_key_queryable.cr diff --git a/src/avram/base_query_template.cr b/src/avram/base_query_template.cr index 20b34c3c0..9b8ce058e 100644 --- a/src/avram/base_query_template.cr +++ b/src/avram/base_query_template.cr @@ -6,6 +6,7 @@ class Avram::BaseQueryTemplate def_clone include Avram::Queryable({{ type }}) + include Avram::PrimaryKeyQueryable({{ type }}) def database : Avram::Database.class {{ type }}.database diff --git a/src/avram/primary_key_queryable.cr b/src/avram/primary_key_queryable.cr new file mode 100644 index 000000000..59846672f --- /dev/null +++ b/src/avram/primary_key_queryable.cr @@ -0,0 +1,21 @@ +require "./errors" + +module Avram::PrimaryKeyQueryable(T) + macro included + def self.find(id) + new.find(id) + end + + def find(id) + id(id).limit(1).first? || raise Avram::RecordNotFoundError.new(model: @@table_name, id: id.to_s) + end + + private def with_ordered_query : self + if query.ordered? + self + else + id.asc_order + end + end + end +end diff --git a/src/avram/queryable.cr b/src/avram/queryable.cr index f102c4ce9..0de5ececc 100644 --- a/src/avram/queryable.cr +++ b/src/avram/queryable.cr @@ -1,8 +1,6 @@ module Avram::Queryable(T) include Enumerable(T) - abstract def id - @query : Avram::QueryBuilder? setter query @@ -17,10 +15,6 @@ module Avram::Queryable(T) new end - def self.find(id) - new.find(id) - end - def self.first new.first end @@ -149,10 +143,6 @@ module Avram::Queryable(T) clone.tap &.query.offset(amount) end - def find(id) - id(id).limit(1).first? || raise RecordNotFoundError.new(model: @@table_name, id: id.to_s) - end - def first? with_ordered_query .limit(1) @@ -213,11 +203,7 @@ module Avram::Queryable(T) end private def with_ordered_query : self - if query.ordered? - self - else - id.asc_order - end + self end def to_sql