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