Skip to content

Commit 6254e17

Browse files
committed
Fix #121 allow column_name option to be used to select a different name
of variable for a specific field
1 parent fc05bd0 commit 6254e17

File tree

5 files changed

+60
-51
lines changed

5 files changed

+60
-51
lines changed

spec/extensions/bcrypt_spec.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ module BCryptSpec
1717
class User
1818
include Clear::Model
1919

20-
primary_key type: :uuid
20+
primary_key :id, type: :uuid
2121

2222
self.table = "bcrypt_users"
2323

spec/model/json_spec.cr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ module ModelSpec
1313
u.last_name.should eq "boss"
1414
u.changed?.should eq false
1515

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

1818
p = Post.new(json2)
1919
p.tags.should eq ["a", "b", "c"]

spec/model/model_spec.cr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ module ModelSpec
3636
column title : String
3737

3838
column tags : Array(String), presence: false
39-
column flags : Array(Int64), presence: false
39+
column flags : Array(Int64), presence: false, column_name: "flags_other_column_name"
4040

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

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

128128
t.references to: "model_users", name: "user_id", on_delete: "cascade"
129129
t.references to: "model_categories", name: "category_id", null: true, on_delete: "set null"

src/clear/extensions/time/interval.cr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,11 @@ end
8585

8686
struct Time
8787
def +(i : Clear::Interval)
88-
self + i.microseconds.microseconds + i.days.days + i.months.months
88+
self + i.months.months + i.days.days + i.microseconds.microseconds
8989
end
9090

9191
def -(i : Clear::Interval)
92-
self - i.microseconds.microseconds - i.days.days - i.months.months
92+
self - i.months.months - i.days.days - i.microseconds.microseconds
9393
end
9494
end
9595

src/clear/model/modules/has_columns.cr

Lines changed: 54 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -167,60 +167,70 @@ module Clear::Model::HasColumns
167167
end
168168
end %}
169169

170-
{% COLUMNS[name.var] = {
170+
{%
171+
db_column_name = column_name == nil ? name.var : column_name.id
172+
173+
COLUMNS["#{db_column_name.id}"] = {
171174
type: _type,
172175
primary: primary,
173176
converter: converter,
174-
column_name: "#{(column_name || name.var)}",
177+
db_column_name: "#{db_column_name.id}",
178+
crystal_variable_name: name.var,
175179
presence: presence,
176-
} %}
180+
}
181+
%}
177182
end
178183

179184
# :nodoc:
180185
# Used internally to gather the columns
181186
macro __generate_columns__
182-
{% for name, settings in COLUMNS %}
187+
{% for db_column_name, settings in COLUMNS %}
183188
{% type = settings[:type] %}
189+
190+
{% var_name = settings[:crystal_variable_name] %}
191+
{% db_name = settings[:db_column_name] %}
192+
184193
{% has_db_default = !settings[:presence] %}
185194
{% converter = Clear::Model::Converter::CONVERTERS[settings[:converter]] %}
186195
{% if converter == nil %}
187196
{% raise "No converter found for `#{settings[:converter].id}`.\n"+
188197
"The type is probably not supported natively by Clear.\n"+
189198
"Please refer to the manual to create a custom converter." %}
190199
{% end %}
191-
@{{name}}_column : Clear::Model::Column({{type}}, {{converter}}) =
192-
Clear::Model::Column({{type}}, {{converter}}).new("{{name}}",
200+
201+
@{{var_name}}_column : Clear::Model::Column({{type}}, {{converter}}) =
202+
Clear::Model::Column({{type}}, {{converter}}).new({{db_name}},
193203
has_db_default: {{has_db_default}} )
194204

195-
# Returns the column object used to manage `{{name}}` field
205+
# Returns the column object used to manage `{{var_name}}` field
196206
#
197207
# See `Clear::Model::Column`
198-
def {{name}}_column : Clear::Model::Column({{type}}, {{converter}})
199-
@{{name}}_column
208+
def {{var_name}}_column : Clear::Model::Column({{type}}, {{converter}})
209+
@{{var_name}}_column
200210
end
201211

202-
# Returns the value of `{{name}}` column or throw an exception if the column is not defined.
203-
def {{name}} : {{type}}
204-
@{{name}}_column.value
212+
# Returns the value of `{{var_name}}` column or throw an exception if the column is not defined.
213+
def {{var_name}} : {{type}}
214+
@{{var_name}}_column.value
205215
end
206216

207-
# Setter for `{{name}}` column.
208-
def {{name}}=(x : {{type}})
209-
@{{name}}_column.value = x
217+
# Setter for `{{var_name}}` column.
218+
def {{var_name}}=(x : {{type}})
219+
@{{var_name}}_column.value = x
210220
end
211221

212222
{% if settings[:primary] %}
213223
# :nodoc:
214-
class_property pkey : String = "{{name}}"
224+
class_property pkey : String = "{{var_name}}"
215225

216226
# :nodoc:
217227
def pkey
218-
@{{name}}_column.value
228+
@{{var_name}}_column.value
219229
end
220230

221231
# :nodoc:
222232
def pkey_column
223-
@{{name}}_column
233+
@{{var_name}}_column
224234
end
225235
{% end %}
226236
{% end %}
@@ -230,13 +240,13 @@ module Clear::Model::HasColumns
230240
super
231241

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

237-
\{% if settings = COLUMNS["#{name}".id] %}
238-
@\{{name}}_column.reset_convert(t[:\{{name}}])
244+
\{% if settings = COLUMNS["#{name}"] %}
245+
@\{{settings[:crystal_variable_name]}}_column.reset_convert(t[:\{{name}}])
239246
\{% else %}
247+
\{% if !@type.has_method?("#{name}=") %}
248+
\{% raise "No method #{@type}##{name}= while trying to set value of #{name}" %}
249+
\{% end %}
240250
self.\{{name}} = t[:\{{name}}]
241251
\{% end %}
242252
\{% end %}
@@ -253,8 +263,8 @@ module Clear::Model::HasColumns
253263
super
254264

255265
\{% for name, settings in COLUMNS %}
256-
v = h.fetch(:\{{settings[:column_name]}}){ Column::UNKNOWN }
257-
@\{{name}}_column.reset_convert(v) unless v.is_a?(Column::UnknownClass)
266+
v = h.fetch(:\{{settings[:db_column_name]}}){ Column::UNKNOWN }
267+
@\{{settings[:crystal_variable_name]}}_column.reset_convert(v) unless v.is_a?(Column::UnknownClass)
258268
\{% end %}
259269

260270
self
@@ -265,8 +275,8 @@ module Clear::Model::HasColumns
265275
super
266276

267277
\{% for name, settings in COLUMNS %}
268-
v = h.fetch(\{{settings[:column_name]}}){ Column::UNKNOWN }
269-
@\{{name}}_column.reset_convert(v) unless v.is_a?(Column::UnknownClass)
278+
v = h.fetch(\{{settings[:db_column_name]}}){ Column::UNKNOWN }
279+
@\{{settings[:crystal_variable_name]}}_column.reset_convert(v) unless v.is_a?(Column::UnknownClass)
270280
\{% end %}
271281

272282
self
@@ -280,13 +290,12 @@ module Clear::Model::HasColumns
280290
super
281291

282292
\{% for name, typ in T %}
283-
\{% if !@type.has_method?("#{name}=") %}
284-
\{% raise "No method #{@type}##{name}= while trying to set value of #{name}" %}
285-
\{% end %}
286-
287293
\{% if settings = COLUMNS["#{name}".id] %}
288-
@\{{name}}_column.set_convert(t[:\{{name}}])
294+
@\{{settings[:crystal_variable_name]}}_column.set_convert(t[:\{{name}}])
289295
\{% else %}
296+
\{% if !@type.has_method?("#{name}=") %}
297+
\{% raise "No method #{@type}##{name}= while trying to set value of #{name}" %}
298+
\{% end %}
290299
self.\{{name}} = t[:\{{name}}]
291300
\{% end %}
292301
\{% end %}
@@ -303,8 +312,8 @@ module Clear::Model::HasColumns
303312
super
304313

305314
\{% for name, settings in COLUMNS %}
306-
v = h.fetch(:\{{settings[:column_name]}}){ Column::UNKNOWN }
307-
@\{{name}}_column.set_convert(v) unless v.is_a?(Column::UnknownClass)
315+
v = h.fetch(:\{{settings[:db_column_name]}}){ Column::UNKNOWN }
316+
@\{{settings[:crystal_variable_name]}}_column.set_convert(v) unless v.is_a?(Column::UnknownClass)
308317
\{% end %}
309318

310319
self
@@ -315,8 +324,8 @@ module Clear::Model::HasColumns
315324
super
316325

317326
\{% for name, settings in COLUMNS %}
318-
v = h.fetch(\{{settings[:column_name]}}){ Column::UNKNOWN }
319-
@\{{name}}_column.set_convert(v) unless v.is_a?(Column::UnknownClass)
327+
v = h.fetch(\{{settings[:db_column_name]}}){ Column::UNKNOWN }
328+
@\{{settings[:crystal_variable_name]}}_column.set_convert(v) unless v.is_a?(Column::UnknownClass)
320329
\{% end %}
321330

322331
self
@@ -332,9 +341,9 @@ module Clear::Model::HasColumns
332341
o = super
333342

334343
{% for name, settings in COLUMNS %}
335-
if @{{name}}_column.defined? &&
336-
@{{name}}_column.changed?
337-
o[{{settings[:column_name]}}] = @{{name}}_column.to_sql_value
344+
if @{{settings[:crystal_variable_name]}}_column.defined? &&
345+
@{{settings[:crystal_variable_name]}}_column.changed?
346+
o[{{settings[:db_column_name]}}] = @{{settings[:crystal_variable_name]}}_column.to_sql_value
338347
end
339348
{% end %}
340349

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

358367
{% for name, settings in COLUMNS %}
359368
unless persisted?
360-
if @{{name}}_column.failed_to_be_present?
361-
add_error({{name.stringify}}, "must be present")
369+
if @{{settings[:crystal_variable_name]}}_column.failed_to_be_present?
370+
add_error({{settings[:crystal_variable_name].stringify}}, "must be present")
362371
end
363372
end
364373
{% end %}
@@ -372,7 +381,7 @@ module Clear::Model::HasColumns
372381
# Returns `self`
373382
def clear_change_flags
374383
{% for name, settings in COLUMNS %}
375-
@{{name}}_column.clear_change_flag
384+
@{{settings[:crystal_variable_name]}}_column.clear_change_flag
376385
{% end %}
377386

378387
self
@@ -383,8 +392,8 @@ module Clear::Model::HasColumns
383392
out = super
384393

385394
{% for name, settings in COLUMNS %}
386-
if full || @{{name}}_column.defined?
387-
out[{{settings[:column_name]}}] = @{{name}}_column.to_sql_value(nil)
395+
if full || @{{settings[:crystal_variable_name]}}_column.defined?
396+
out[{{settings[:db_column_name]}}] = @{{settings[:crystal_variable_name]}}_column.to_sql_value(nil)
388397
end
389398
{% end %}
390399

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

401410
return false

0 commit comments

Comments
 (0)