Sha256: c3c0cc6900522d51563b7913d1e54d3c389600c62396d29ea87df4a512d6ebe3

Contents?: true

Size: 1.64 KB

Versions: 1

Compression:

Stored size: 1.64 KB

Contents

# Models a Rails model

require 'katapult/element'
require 'katapult/elements/attribute'
require 'generators/katapult/model/model_generator'

module Katapult
  class Model < Element

    UnknownAttributeError = Class.new(StandardError)
    MissingLabelAttributeError = Class.new(StandardError)

    attr_accessor :attrs, :belongs_tos, :has_manys

    def initialize(*args)
      self.attrs = []
      self._belongs_tos = []
      self.belongs_tos = []
      self.has_manys = []

      super
    end

    # DSL
    def attr(attr_name, options = {})
      options[:model] = self
      attrs << Attribute.new(attr_name, options)
    end

    # DSL
    def belongs_to(model_name)
      application_model.association name, belongs_to: model_name
    end


    def label_attr
      renderable_attrs.first.presence or raise MissingLabelAttributeError
    end

    def label_attr?
      label_attr.present?
    rescue MissingLabelAttributeError
      false
    end

    def db_fields
      attrs.reject(&:skip_db)
    end

    def renderable_attrs
      attrs.select &:renderable?
    end

    def editable_attrs
      attrs.select &:editable?
    end

    def required_attrs
      attrs.select &:required?
    end

    def add_foreign_key_attrs(belongs_tos)
      belongs_tos.each do |other_model|
        attr "#{ other_model.name :variable }_id", type: :foreign_key,
          assignable_values: "#{ other_model.name(:class) }.all.to_a",
          allow_blank: true,
          associated_model: other_model
      end
    end

    def render(options = {})
      Generators::ModelGenerator.new(self, options).invoke_all
    end

    private

    attr_accessor :_belongs_tos

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
katapult-0.5.0 lib/katapult/elements/model.rb