Module: HasMetaData::ClassMethods

Defined in:
lib/has_meta_data.rb

Instance Method Summary collapse

Instance Method Details

#has_meta_data(options = {}, &block) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/has_meta_data.rb', line 7

def (options = {}, &block)
  return if self.included_modules.include?(HasMetaData::InstanceMethods)
  include HasMetaData::InstanceMethods
  
  cattr_accessor :meta_data_class_name, :meta_data_foreign_key, :meta_data_table_name, :meta_data_columns
  
  self. = options[:class_name]  || 'Meta'
  self. = options[:foreign_key] || self.to_s.foreign_key
  self. = options[:table_name]  || "#{table_name_prefix}#{self.name.demodulize.underscore}_meta#{table_name_suffix}"
  
  
  # Create Relationship to Meta Data
  class_eval do
    has_one :meta, 
      :class_name => "#{self.to_s}::#{}",
      :foreign_key => ,
      :dependent => :destroy
    
    scope :with_meta, lambda { includes(:meta).where("#{}.id IS NOT NULL") }
    scope :without_meta, lambda { includes(:meta).where("#{}.id IS NULL") }
  end
  
  # Dynamically Create Model::Meta Class
  const_set(, Class.new(ActiveRecord::Base))
  
  .cattr_accessor :original_class
  .original_class = self
  .table_name = 
  
  # Draft Parent Association
  .belongs_to self.to_s.demodulize.underscore.to_sym, :class_name => "::#{self.to_s}", :foreign_key => 
  
  # Block extension
  .class_eval(&block) if block_given?
  
  # Finally setup attribute delegation to the meta fields
  self. = .content_columns.map(&:name)
  
  .each do |field|
    define_method(field.to_sym) do
      meta.send(field.to_sym) if has_meta_data?
    end
    
    define_method("#{field}=".to_sym) do |value|
      self.build_meta unless has_meta_data?
      meta.send("#{field}=".to_sym, value)
    end
  end
end

#meta_data_classObject



57
58
59
# File 'lib/has_meta_data.rb', line 57

def 
  const_get()
end