module Dynabute::Dynabutable
Public Class Methods
dynabute_relation_names()
click to toggle source
# File lib/dynabute/dynabutable.rb, line 22 def self.dynabute_relation_names Util.all_value_relation_names end
dynabutes()
click to toggle source
# File lib/dynabute/dynabutable.rb, line 18 def self.dynabutes Dynabute::Field.for(self.to_s) end
Public Instance Methods
build_dynabute_value(name: nil, field_id: nil, field: nil, **rest)
click to toggle source
# File lib/dynabute/dynabutable.rb, line 48 def build_dynabute_value(name: nil, field_id: nil, field: nil, **rest) field = find_field(name, field_id, field) send(Util.value_relation_name(field.value_type)).build(field_id: field.id, **rest) end
dynabute_fields()
click to toggle source
# File lib/dynabute/dynabutable.rb, line 26 def dynabute_fields Dynabute::Field.for(self.class.to_s) end
dynabute_value(name: nil, field_id: nil, field: nil)
click to toggle source
# File lib/dynabute/dynabutable.rb, line 38 def dynabute_value(name: nil, field_id: nil, field: nil) field = find_field(name, field_id, field) if field.has_many send(Util.value_relation_name(field.value_type)).select{|v| v.field_id == field.id } else send(Util.value_relation_name(field.value_type)).detect{|v| v.field_id == field.id } end end
dynabute_values()
click to toggle source
# File lib/dynabute/dynabutable.rb, line 30 def dynabute_values dynabute_fields .group_by{|f| f.value_type } .map { |_, fields| send(Util.value_relation_name(fields.first.value_type)) }.flatten.compact end
find_field(name, id, field)
click to toggle source
# File lib/dynabute/dynabutable.rb, line 66 def find_field(name, id, field) name_or_id = {name: name, id: id}.compact return nil if name_or_id.blank? && field.blank? field_obj = field || Dynabute::Field.find_by(name_or_id.merge(target_model: self.class.to_s)) fail Dynabute::FieldNotFound.new(name_or_id, field) if field_obj.nil? field_obj end
method_missing(*args)
click to toggle source
Calls superclass method
# File lib/dynabute/dynabutable.rb, line 53 def method_missing(*args) name = args[0] one = name.to_s.scan(/^dynabute_(.+)_value$/)[0] many = name.to_s.scan(/^dynabute_(.+)_values$/)[0] return super if one.nil? && many.nil? target = one ? one : many candidates = [target[0], target[0].gsub('_', ' ')] field = Dynabute::Field.find_by(name: candidates) return super if field.nil? dynabute_value(field: field) end