# this is the base class of all configurable settings
class ConfigurableSetting < ActiveRecord::Base
belongs_to :configurable, :polymorphic => true
belongs_to :targetable, :polymorphic => true
# ==For migration up
# in your migration self.up method:
# ConfigurableSetting.create_table
def self.create_table
self.connection.create_table :configurable_settings, :options => 'ENGINE=InnoDB' do |t|
t.column :configurable_id, :integer
t.column :configurable_type, :string
t.column :targetable_id, :integer
t.column :targetable_type, :string
t.column :name, :string, :null => false
t.column :value_type, :string
t.column :value, :text, :null => true
end
self.connection.add_index :configurable_settings, :name
end
# ==For migration down
# in your migration self.down method:
# ConfigurableSetting.drop_table
def self.drop_table
self.connection.remove_index :configurable_settings, :name
self.connection.drop_table :configurable_settings
end
# returns a string with the classname of configurable
def self.configurable_class(configurable) # :nodoc:
ActiveRecord::Base.send(:class_name_of_active_record_descendant, configurable.class).to_s
end
# returns a string with the classname of configurable
def self.targetable_class(targetable) # :nodoc:
ActiveRecord::Base.send(:class_name_of_active_record_descendant, targetable.class).to_s
end
# returns the instance of the "owner" of the setting
def self.find_configurable(configured_class, configured_id) # :nodoc:
configured_class.constantize.find(configured_id)
end
# returns the instance of the "target" of the setting
def self.find_targetable(targeted_class, targeted_id) # :nodoc:
targeted_class.constantize.find(targeted_id)
end
end