Class: Ezframe::ColumnSet

Inherits:
Object show all
Defined in:
lib/ezframe/column_set.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parent: nil, name: nil, columns: nil) ⇒ ColumnSet

Returns a new instance of ColumnSet.



188
189
190
191
192
193
# File 'lib/ezframe/column_set.rb', line 188

def initialize(parent: nil, name: nil, columns: nil)
  @parent = parent
  @name = name
  @columns ||= {}
  set(columns) if columns
end

Instance Attribute Details

#nameObject

, :edit_keys, :view_keys



186
187
188
# File 'lib/ezframe/column_set.rb', line 186

def name
  @name
end

#parentObject

, :edit_keys, :view_keys



186
187
188
# File 'lib/ezframe/column_set.rb', line 186

def parent
  @parent
end

Instance Method Details

#[](col_key) ⇒ Object



374
375
376
# File 'lib/ezframe/column_set.rb', line 374

def [](col_key)
  return @columns[col_key.to_sym]
end

#clearObject



195
196
197
198
199
# File 'lib/ezframe/column_set.rb', line 195

def clear
  @columns.each do |key, col|
    col.value = nil
  end
end

#clear_errorObject



344
345
346
# File 'lib/ezframe/column_set.rb', line 344

def clear_error
  @columns.values.each { |col| col.error = nil }
end

#create(value_h, from_db: nil, key_suffix: nil) ⇒ Object

データベースに新規に値を登録する



250
251
252
253
254
255
256
257
258
259
260
261
262
263
# File 'lib/ezframe/column_set.rb', line 250

def create(value_h, from_db: nil, key_suffix: nil)
  if from_db
    self.set_values(value_h, from_db: true, key_suffix: key_suffix)
  else
    self.set_values(value_h, key_suffix: key_suffix)
  end
  db_value_h = self.get_hash(:db_value)
  EzLog.debug("column_set.create: #{db_value_h}")
  db_value_h.delete(:id)
  db_value_h[:updated_at] = Time.now
  db_value_h[:created_at] = Time.now
  EzLog.debug("create: sql=#{dataset.insert_sql(db_value_h)}")
  return dataset.insert(db_value_h)
end

#datasetObject



234
235
236
# File 'lib/ezframe/column_set.rb', line 234

def dataset
  return DB.dataset(@name)
end

#eachObject



352
353
354
# File 'lib/ezframe/column_set.rb', line 352

def each
  @columns.values.each { |column| yield(column) }
end

#edit_keysObject



205
206
207
# File 'lib/ezframe/column_set.rb', line 205

def edit_keys
  @columns.keys.select {|k| !@columns[k].no_edit? }
end

#formObject



378
379
380
381
382
383
384
385
386
387
388
389
390
391
# File 'lib/ezframe/column_set.rb', line 378

def form
  if @edit_keys
    return @edit_keys.map do |key|
             col = @columns[key.to_sym]
             unless col
               EzLog.info "[ERROR] @edit_keys has unknown column:name=#{@name}:key=#{key}"
               next
             end
             col.form
           end
  else
    return @columns.values.map { |coltype| coltype.form }
  end
end

#get_full_join(opts = {}) ⇒ Object



408
409
410
411
# File 'lib/ezframe/column_set.rb', line 408

def get_full_join(opts = {})
  struct = ColumnSets.full_join_structure(self.name)
  return DB.get_join_table(struct, opts)
end

#get_hash(method) ⇒ Object



366
367
368
369
370
371
372
# File 'lib/ezframe/column_set.rb', line 366

def get_hash(method)
  res_h = {}
  @columns.map do |key, col|
    res_h[key.to_sym] = col.send(method)
  end
  return res_h
end

#get_matrix(method_a) ⇒ Object



360
361
362
363
364
# File 'lib/ezframe/column_set.rb', line 360

def get_matrix(method_a)
  return @columns.map do |_key, col|
           method_a.map { |method| col.send(method) }
         end
end

#hidden_formObject



413
414
415
416
417
# File 'lib/ezframe/column_set.rb', line 413

def hidden_form
  return @columns.map do |colkey, coltype|
           { tag: "input", id: colkey, name: colkey, type: "hidden", value: coltype.value }
         end
end

#inpsectObject



419
420
421
422
423
# File 'lib/ezframe/column_set.rb', line 419

def inpsect
  @columns.map do |colkey, coltype|
    "#{colkey}=#{coltype.value}"
  end.join(" ")
end

#keysObject



201
202
203
# File 'lib/ezframe/column_set.rb', line 201

def keys
  @columns.keys
end

#mapObject



356
357
358
# File 'lib/ezframe/column_set.rb', line 356

def map
  @columns.values.map { |column| yield(column) }
end

#merge_values(value_h, from_db: nil, key_suffix: nil) ⇒ Object



301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
# File 'lib/ezframe/column_set.rb', line 301

def merge_values(value_h, from_db: nil, key_suffix: nil)
  return self unless value_h
  @columns.keys.each do |key|
    next if key.to_s.empty?
    target_key = key
    target_key = "#{key}#{key_suffix}" if key_suffix
    column = @columns[key.to_sym]
    if !from_db && column.respond_to?(:form_to_value) # && !value_h.has_key?(key)
      val = column.form_to_value(value_h, target_key: target_key)
    else
      val = value_h[target_key.to_sym] || value_h[key]
    end
    column.value = val
  end
  return self
end

#set(attr_a) ⇒ Object

配列を初期化する



214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# File 'lib/ezframe/column_set.rb', line 214

def set(attr_a)
  @columns[:id] = IdType.new(key: "id", label: "ID", hidden: true)
  attr_a.each do |attribute|
    attr = attribute.clone
    col_key = attr[:key]
    raise "no column key: #{attr.inspect}" unless col_key
    klass = TypeBase.get_class(attr[:type])
    unless klass
      raise "no such column type: #{attr[:type]}"
    else
      @columns[col_key.to_sym] = klass.new(attr)
    end
  end
  @columns[:created_at] = DatetimeType.new(type: "datetime", key: "created_at", label: "生成日時", hidden: true)
  @columns[:updated_at] = DatetimeType.new(type: "datetime", key: "updated_at", label: "更新日時", hidden: true)
  @columns[:deleted_at] = DatetimeType.new(type: "datetime", key: "deleted_at", label: "削除日時", hidden: true)
  @columns.values.each { |col| col.parent = self }
  return @columns
end

#set_from_db(id) ⇒ Object



238
239
240
241
242
243
# File 'lib/ezframe/column_set.rb', line 238

def set_from_db(id)
  data = dataset.where(id: id).first
  return nil unless data
  self.set_values(data, from_db: true)
  return data
end

#set_from_form(form, key_suffix: nil) ⇒ Object



245
246
247
# File 'lib/ezframe/column_set.rb', line 245

def set_from_form(form, key_suffix: nil)
  self.set_values(form)
end

#set_values(value_h, from_db: nil, key_suffix: nil) ⇒ Object

各カラムに値を格納する



296
297
298
299
# File 'lib/ezframe/column_set.rb', line 296

def set_values(value_h, from_db: nil, key_suffix: nil)
  self.clear
  merge_values(value_h, from_db: from_db, key_suffix: key_suffix)
end

#update(id, value_h) ⇒ Object

データベース上の値の更新



266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
# File 'lib/ezframe/column_set.rb', line 266

def update(id, value_h)
  self.set_from_db(id)
  updated_values = {}
  @columns.each do |colkey, column|
    next if column.no_edit?
    if column.respond_to?(:form_to_value)
      new_value = column.form_to_value(value_h)
    else
      new_value = value_h[colkey]
    end
    prev_value = column.db_value
    column.value = new_value
    # EzLog.debug("key=#{colkey}, pre_value=#{prev_value}, new_value=#{column.db_value}")
    if column.respond_to?("value_equal?")
      unless column.value_equal?(prev_value, column.db_value)
        updated_values[colkey] = column.db_value
      end
    elsif prev_value != column.db_value
      updated_values[colkey] = column.db_value
    end
  end
  if updated_values.length > 0
    updated_values[:updated_at] = Time.now
    sql = dataset.where(id: id).update_sql(updated_values)
    EzLog.debug("update: sql=#{sql}")
    dataset.where(id: id).update(updated_values)
  end
end

#validate(value_h) ⇒ Object

各カラムのバリデーション 戻り値は[ 正規化した値, エラーシンボル(Messageのキーと紐づく) ]を値として、 カラムキーをキーとするハッシュ



325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
# File 'lib/ezframe/column_set.rb', line 325

def validate(value_h)
  return {} unless value_h
  clear_error
  result_h = {}
  @columns.values.each do |col|
    res = []
    if col.respond_to?(:form_to_value) && !value_h.has_key?(col.key)
      orig_val = col.form_to_value(value_h)
    else
      orig_val = value_h[col.key]
    end
    new_val = col.normalize(orig_val)
    res[0] = new_val if orig_val != new_val
    res[1] = col.validate(new_val)
    result_h[col.key] = res if res[0] || res[1]
  end
  return result_h
end

#valuesObject



348
349
350
# File 'lib/ezframe/column_set.rb', line 348

def values
  @columns.map { |key, col| col.value }
end

#values=(value_h) ⇒ Object



318
319
320
# File 'lib/ezframe/column_set.rb', line 318

def values=(value_h)
  set_values(value_h)
end

#viewObject



393
394
395
396
397
398
399
400
401
402
403
404
405
406
# File 'lib/ezframe/column_set.rb', line 393

def view
  if @view_keys
    return @view_keys.map do |key|
             col = @columns[key.to_sym]
             unless col
               EzLog.info "[ERROR] @view_keys has unknown column:name=#{@name}:key=#{key}"
               next
             end
             col.view
           end
  else
    return @columns.values.map { |coltype| coltype.view }
  end
end

#view_keysObject



209
210
211
# File 'lib/ezframe/column_set.rb', line 209

def view_keys
  @columns.keys.select {|k| !@columns[k].no_view? }
end