Class: Ezframe::ColumnSet
Instance Attribute Summary collapse
-
#name ⇒ Object
, :edit_keys, :view_keys.
-
#parent ⇒ Object
, :edit_keys, :view_keys.
Instance Method Summary collapse
- #[](col_key) ⇒ Object
- #clear ⇒ Object
- #clear_error ⇒ Object
-
#create(value_h, from_db: nil, key_suffix: nil) ⇒ Object
データベースに新規に値を登録する.
- #dataset ⇒ Object
- #each ⇒ Object
- #edit_keys ⇒ Object
- #form ⇒ Object
- #get_full_join(opts = {}) ⇒ Object
- #get_hash(method) ⇒ Object
- #get_matrix(method_a) ⇒ Object
- #hidden_form ⇒ Object
-
#initialize(parent: nil, name: nil, columns: nil) ⇒ ColumnSet
constructor
A new instance of ColumnSet.
- #inpsect ⇒ Object
- #keys ⇒ Object
- #map ⇒ Object
- #merge_values(value_h, from_db: nil, key_suffix: nil) ⇒ Object
-
#set(attr_a) ⇒ Object
配列を初期化する.
- #set_from_db(id) ⇒ Object
- #set_from_form(form, key_suffix: nil) ⇒ Object
-
#set_values(value_h, from_db: nil, key_suffix: nil) ⇒ Object
各カラムに値を格納する.
-
#update(id, value_h) ⇒ Object
データベース上の値の更新.
-
#validate(value_h) ⇒ Object
各カラムのバリデーション 戻り値は[ 正規化した値, エラーシンボル(Messageのキーと紐づく) ]を値として、 カラムキーをキーとするハッシュ.
- #values ⇒ Object
- #values=(value_h) ⇒ Object
- #view ⇒ Object
- #view_keys ⇒ Object
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
#name ⇒ Object
, :edit_keys, :view_keys
186 187 188 |
# File 'lib/ezframe/column_set.rb', line 186 def name @name end |
#parent ⇒ Object
, :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 |
#clear ⇒ Object
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_error ⇒ Object
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 |
#dataset ⇒ Object
234 235 236 |
# File 'lib/ezframe/column_set.rb', line 234 def dataset return DB.dataset(@name) end |
#each ⇒ Object
352 353 354 |
# File 'lib/ezframe/column_set.rb', line 352 def each @columns.values.each { |column| yield(column) } end |
#edit_keys ⇒ Object
205 206 207 |
# File 'lib/ezframe/column_set.rb', line 205 def edit_keys @columns.keys.select {|k| !@columns[k].no_edit? } end |
#form ⇒ Object
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_form ⇒ Object
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 |
#inpsect ⇒ Object
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 |
#keys ⇒ Object
201 202 203 |
# File 'lib/ezframe/column_set.rb', line 201 def keys @columns.keys end |
#map ⇒ Object
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 |
#values ⇒ Object
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 |
#view ⇒ Object
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_keys ⇒ Object
209 210 211 |
# File 'lib/ezframe/column_set.rb', line 209 def view_keys @columns.keys.select {|k| !@columns[k].no_view? } end |