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