class Ezframe::ColumnSet

Attributes

name[RW]
parent[RW]

Public Class Methods

new(parent: nil, name: nil, columns: nil) click to toggle source
# 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

Public Instance Methods

[](col_key) click to toggle source
# File lib/ezframe/column_set.rb, line 374
def [](col_key)
  return @columns[col_key.to_sym]
end
clear() click to toggle source
# File lib/ezframe/column_set.rb, line 195
def clear
  @columns.each do |key, col|
    col.value = nil
  end
end
clear_error() click to toggle source
# 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) click to toggle source

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

# 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
dataset() click to toggle source
# File lib/ezframe/column_set.rb, line 234
def dataset
  return DB.dataset(@name)
end
each() { |column| ... } click to toggle source
# File lib/ezframe/column_set.rb, line 352
def each
  @columns.values.each { |column| yield(column) }
end
edit_keys() click to toggle source
# File lib/ezframe/column_set.rb, line 205
def edit_keys
  @columns.keys.select {|k| !@columns[k].no_edit? }
end
form() click to toggle source
# 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 = {}) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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_form() click to toggle source
# 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
inpsect() click to toggle source
# File lib/ezframe/column_set.rb, line 419
def inpsect
  @columns.map do |colkey, coltype|
    "#{colkey}=#{coltype.value}"
  end.join(" ")
end
keys() click to toggle source
# File lib/ezframe/column_set.rb, line 201
def keys
  @columns.keys
end
map() { |column| ... } click to toggle source
# 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) click to toggle source
# 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) click to toggle source

配列を初期化する

# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source

各カラムに値を格納する

# 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) click to toggle source

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

# 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) click to toggle source

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

# 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
values() click to toggle source
# File lib/ezframe/column_set.rb, line 348
def values
  @columns.map { |key, col| col.value }
end
values=(value_h) click to toggle source
# File lib/ezframe/column_set.rb, line 318
def values=(value_h)
  set_values(value_h)
end
view() click to toggle source
# 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_keys() click to toggle source
# File lib/ezframe/column_set.rb, line 209
def view_keys
  @columns.keys.select {|k| !@columns[k].no_view? }
end