module Property::StoredRole

This module lets you use a custom class to store a set of property definitions inside the database. For the rest, this class behaves just like Role.

Once this module is included, you need to set the has_many association to the class that contains the columns definitions with something like:

stored_columns_class NameOfColumnsClass

Public Class Methods

included(base) click to toggle source
# File lib/property/stored_role.rb, line 21
def self.included(base)
  base.class_eval do
    after_save :update_columns
    validates_presence_of :name

    extend ClassMethods

    def self.new(arg, &block)
      unless arg.kind_of?(Hash)
        arg = {:name => arg}
      end

      if block_given?
        obj = super(arg) do
          # Dummy block to hide our special property declaration block
        end

        obj.property(&block)
      else
        obj = super(arg)
      end

      obj
    end
  end
end
new(arg, &block) click to toggle source
Calls superclass method
# File lib/property/stored_role.rb, line 28
def self.new(arg, &block)
  unless arg.kind_of?(Hash)
    arg = {:name => arg}
  end

  if block_given?
    obj = super(arg) do
      # Dummy block to hide our special property declaration block
    end

    obj.property(&block)
  else
    obj = super(arg)
  end

  obj
end

Public Instance Methods

defined_columns() click to toggle source

Get all property definitions defined for this role

Calls superclass method Property::RoleModule#defined_columns
# File lib/property/stored_role.rb, line 49
def defined_columns
  load_columns_from_db unless @columns_from_db_loaded
  super
end
name() click to toggle source

Overwrite name reader in RoleModule

# File lib/property/stored_role.rb, line 59
def name
  self[:name]
end
property() click to toggle source
Calls superclass method Property::RoleModule#property
# File lib/property/stored_role.rb, line 54
def property
  super
end

Private Instance Methods

load_columns_from_db() click to toggle source
# File lib/property/stored_role.rb, line 65
def load_columns_from_db
  @columns_from_db_loaded = true
  @original_columns = {}
  stored_columns.each do |column|
    @original_columns[column.name] = column
    add_column(Property::Column.new(column.name, column.default, column.klass || column.ptype, column.options.merge(:role => self, :orig => column)))
  end
end
update_columns() click to toggle source
# File lib/property/stored_role.rb, line 74
def update_columns
  return unless @defined_columns # no change
  unless @original_columns
    load_columns_from_db
  end
  stored_column_names  = @original_columns.keys
  defined_column_names = column_names

  new_columns     = defined_column_names - stored_column_names
  updated_columns = defined_column_names & stored_column_names
  # Not needed: there is no way to remove a property right now
  # deleted_columns = stored_column_names - defined_column_names

  new_columns.each do |name|
    stored_columns.create(:name => name, :ptype => columns[name].type.to_s)
  end

  updated_columns.each do |name|
    @original_columns[name].update_attributes(:name => name, :ptype => columns[name].type.to_s)
  end

  # Not needed: there is no way to remove a property right now
  # deleted_columns.each do |name|
  #   @original_columns[name].destroy!
  # end
end