Skip to content

Commit

Permalink
Merge pull request #122 from anykeyh/fix_121_column_name_altered
Browse files Browse the repository at this point in the history
Fix #121
  • Loading branch information
anykeyh committed May 31, 2019
2 parents fc05bd0 + 6254e17 commit ec2714b
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 51 deletions.
2 changes: 1 addition & 1 deletion spec/extensions/bcrypt_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ module BCryptSpec
class User
include Clear::Model

primary_key type: :uuid
primary_key :id, type: :uuid

self.table = "bcrypt_users"

Expand Down
2 changes: 1 addition & 1 deletion spec/model/json_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ module ModelSpec
u.last_name.should eq "boss"
u.changed?.should eq false

json2 = JSON.parse(%<{"tags": ["a", "b", "c"], "flags": [1, 2, 3]}>)
json2 = JSON.parse(%<{"tags": ["a", "b", "c"], "flags_other_column_name": [1, 2, 3]}>)

p = Post.new(json2)
p.tags.should eq ["a", "b", "c"]
Expand Down
4 changes: 2 additions & 2 deletions spec/model/model_spec.cr
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ module ModelSpec
column title : String

column tags : Array(String), presence: false
column flags : Array(Int64), presence: false
column flags : Array(Int64), presence: false, column_name: "flags_other_column_name"

def validate
ensure_than(title, "is not empty", &.size.>(0))
Expand Down Expand Up @@ -123,7 +123,7 @@ module ModelSpec
t.column "title", "string", index: true

t.column "tags", "string", array: true, index: "gin", default: "ARRAY['post', 'arr 2']"
t.column "flags", "bigint", array: true, index: "gin", default: "'{}'::bigint[]"
t.column "flags_other_column_name", "bigint", array: true, index: "gin", default: "'{}'::bigint[]"

t.references to: "model_users", name: "user_id", on_delete: "cascade"
t.references to: "model_categories", name: "category_id", null: true, on_delete: "set null"
Expand Down
4 changes: 2 additions & 2 deletions src/clear/extensions/time/interval.cr
Original file line number Diff line number Diff line change
Expand Up @@ -85,11 +85,11 @@ end

struct Time
def +(i : Clear::Interval)
self + i.microseconds.microseconds + i.days.days + i.months.months
self + i.months.months + i.days.days + i.microseconds.microseconds
end

def -(i : Clear::Interval)
self - i.microseconds.microseconds - i.days.days - i.months.months
self - i.months.months - i.days.days - i.microseconds.microseconds
end
end

Expand Down
99 changes: 54 additions & 45 deletions src/clear/model/modules/has_columns.cr
Original file line number Diff line number Diff line change
Expand Up @@ -167,60 +167,70 @@ module Clear::Model::HasColumns
end
end %}

{% COLUMNS[name.var] = {
{%
db_column_name = column_name == nil ? name.var : column_name.id

COLUMNS["#{db_column_name.id}"] = {
type: _type,
primary: primary,
converter: converter,
column_name: "#{(column_name || name.var)}",
db_column_name: "#{db_column_name.id}",
crystal_variable_name: name.var,
presence: presence,
} %}
}
%}
end

# :nodoc:
# Used internally to gather the columns
macro __generate_columns__
{% for name, settings in COLUMNS %}
{% for db_column_name, settings in COLUMNS %}
{% type = settings[:type] %}

{% var_name = settings[:crystal_variable_name] %}
{% db_name = settings[:db_column_name] %}

{% has_db_default = !settings[:presence] %}
{% converter = Clear::Model::Converter::CONVERTERS[settings[:converter]] %}
{% if converter == nil %}
{% raise "No converter found for `#{settings[:converter].id}`.\n"+
"The type is probably not supported natively by Clear.\n"+
"Please refer to the manual to create a custom converter." %}
{% end %}
@{{name}}_column : Clear::Model::Column({{type}}, {{converter}}) =
Clear::Model::Column({{type}}, {{converter}}).new("{{name}}",

@{{var_name}}_column : Clear::Model::Column({{type}}, {{converter}}) =
Clear::Model::Column({{type}}, {{converter}}).new({{db_name}},
has_db_default: {{has_db_default}} )

# Returns the column object used to manage `{{name}}` field
# Returns the column object used to manage `{{var_name}}` field
#
# See `Clear::Model::Column`
def {{name}}_column : Clear::Model::Column({{type}}, {{converter}})
@{{name}}_column
def {{var_name}}_column : Clear::Model::Column({{type}}, {{converter}})
@{{var_name}}_column
end

# Returns the value of `{{name}}` column or throw an exception if the column is not defined.
def {{name}} : {{type}}
@{{name}}_column.value
# Returns the value of `{{var_name}}` column or throw an exception if the column is not defined.
def {{var_name}} : {{type}}
@{{var_name}}_column.value
end

# Setter for `{{name}}` column.
def {{name}}=(x : {{type}})
@{{name}}_column.value = x
# Setter for `{{var_name}}` column.
def {{var_name}}=(x : {{type}})
@{{var_name}}_column.value = x
end

{% if settings[:primary] %}
# :nodoc:
class_property pkey : String = "{{name}}"
class_property pkey : String = "{{var_name}}"

# :nodoc:
def pkey
@{{name}}_column.value
@{{var_name}}_column.value
end

# :nodoc:
def pkey_column
@{{name}}_column
@{{var_name}}_column
end
{% end %}
{% end %}
Expand All @@ -230,13 +240,13 @@ module Clear::Model::HasColumns
super

\{% for name, typ in T %}
\{% if !@type.has_method?("#{name}=") %}
\{% raise "No method #{@type}##{name}= while trying to set value of #{name}" %}
\{% end %}

\{% if settings = COLUMNS["#{name}".id] %}
@\{{name}}_column.reset_convert(t[:\{{name}}])
\{% if settings = COLUMNS["#{name}"] %}
@\{{settings[:crystal_variable_name]}}_column.reset_convert(t[:\{{name}}])
\{% else %}
\{% if !@type.has_method?("#{name}=") %}
\{% raise "No method #{@type}##{name}= while trying to set value of #{name}" %}
\{% end %}
self.\{{name}} = t[:\{{name}}]
\{% end %}
\{% end %}
Expand All @@ -253,8 +263,8 @@ module Clear::Model::HasColumns
super

\{% for name, settings in COLUMNS %}
v = h.fetch(:\{{settings[:column_name]}}){ Column::UNKNOWN }
@\{{name}}_column.reset_convert(v) unless v.is_a?(Column::UnknownClass)
v = h.fetch(:\{{settings[:db_column_name]}}){ Column::UNKNOWN }
@\{{settings[:crystal_variable_name]}}_column.reset_convert(v) unless v.is_a?(Column::UnknownClass)
\{% end %}

self
Expand All @@ -265,8 +275,8 @@ module Clear::Model::HasColumns
super

\{% for name, settings in COLUMNS %}
v = h.fetch(\{{settings[:column_name]}}){ Column::UNKNOWN }
@\{{name}}_column.reset_convert(v) unless v.is_a?(Column::UnknownClass)
v = h.fetch(\{{settings[:db_column_name]}}){ Column::UNKNOWN }
@\{{settings[:crystal_variable_name]}}_column.reset_convert(v) unless v.is_a?(Column::UnknownClass)
\{% end %}

self
Expand All @@ -280,13 +290,12 @@ module Clear::Model::HasColumns
super

\{% for name, typ in T %}
\{% if !@type.has_method?("#{name}=") %}
\{% raise "No method #{@type}##{name}= while trying to set value of #{name}" %}
\{% end %}

\{% if settings = COLUMNS["#{name}".id] %}
@\{{name}}_column.set_convert(t[:\{{name}}])
@\{{settings[:crystal_variable_name]}}_column.set_convert(t[:\{{name}}])
\{% else %}
\{% if !@type.has_method?("#{name}=") %}
\{% raise "No method #{@type}##{name}= while trying to set value of #{name}" %}
\{% end %}
self.\{{name}} = t[:\{{name}}]
\{% end %}
\{% end %}
Expand All @@ -303,8 +312,8 @@ module Clear::Model::HasColumns
super

\{% for name, settings in COLUMNS %}
v = h.fetch(:\{{settings[:column_name]}}){ Column::UNKNOWN }
@\{{name}}_column.set_convert(v) unless v.is_a?(Column::UnknownClass)
v = h.fetch(:\{{settings[:db_column_name]}}){ Column::UNKNOWN }
@\{{settings[:crystal_variable_name]}}_column.set_convert(v) unless v.is_a?(Column::UnknownClass)
\{% end %}

self
Expand All @@ -315,8 +324,8 @@ module Clear::Model::HasColumns
super

\{% for name, settings in COLUMNS %}
v = h.fetch(\{{settings[:column_name]}}){ Column::UNKNOWN }
@\{{name}}_column.set_convert(v) unless v.is_a?(Column::UnknownClass)
v = h.fetch(\{{settings[:db_column_name]}}){ Column::UNKNOWN }
@\{{settings[:crystal_variable_name]}}_column.set_convert(v) unless v.is_a?(Column::UnknownClass)
\{% end %}

self
Expand All @@ -332,9 +341,9 @@ module Clear::Model::HasColumns
o = super

{% for name, settings in COLUMNS %}
if @{{name}}_column.defined? &&
@{{name}}_column.changed?
o[{{settings[:column_name]}}] = @{{name}}_column.to_sql_value
if @{{settings[:crystal_variable_name]}}_column.defined? &&
@{{settings[:crystal_variable_name]}}_column.changed?
o[{{settings[:db_column_name]}}] = @{{settings[:crystal_variable_name]}}_column.to_sql_value
end
{% end %}

Expand All @@ -357,8 +366,8 @@ module Clear::Model::HasColumns

{% for name, settings in COLUMNS %}
unless persisted?
if @{{name}}_column.failed_to_be_present?
add_error({{name.stringify}}, "must be present")
if @{{settings[:crystal_variable_name]}}_column.failed_to_be_present?
add_error({{settings[:crystal_variable_name].stringify}}, "must be present")
end
end
{% end %}
Expand All @@ -372,7 +381,7 @@ module Clear::Model::HasColumns
# Returns `self`
def clear_change_flags
{% for name, settings in COLUMNS %}
@{{name}}_column.clear_change_flag
@{{settings[:crystal_variable_name]}}_column.clear_change_flag
{% end %}

self
Expand All @@ -383,8 +392,8 @@ module Clear::Model::HasColumns
out = super

{% for name, settings in COLUMNS %}
if full || @{{name}}_column.defined?
out[{{settings[:column_name]}}] = @{{name}}_column.to_sql_value(nil)
if full || @{{settings[:crystal_variable_name]}}_column.defined?
out[{{settings[:db_column_name]}}] = @{{settings[:crystal_variable_name]}}_column.to_sql_value(nil)
end
{% end %}

Expand All @@ -395,7 +404,7 @@ module Clear::Model::HasColumns
# have been changed.). Return `false` otherwise.
def changed?
{% for name, settings in COLUMNS %}
return true if @{{name}}_column.changed?
return true if @{{settings[:crystal_variable_name]}}_column.changed?
{% end %}

return false
Expand Down

0 comments on commit ec2714b

Please sign in to comment.