module Redcrumbs::SerializableAssociation::ClassMethods

Public Instance Methods

serializable_association(name) click to toggle source
# File lib/redcrumbs/serializable_association.rb, line 15
def serializable_association(name)
  raise ArgumentError unless name and [:creator, :target, :subject].include?(name)

  property "stored_#{name}".to_sym, DataMapper::Property::Json, :lazy => false
  property "#{name}_id".to_sym, DataMapper::Property::Integer, :index => true, :lazy => false
  property "#{name}_type".to_sym, DataMapper::Property::String, :index => true, :lazy => false

  define_setter_for(name)
  define_getter_for(name)
  define_loader_for(name)
  define_load_state_getter(name)

  self
end

Private Instance Methods

define_getter_for(name) click to toggle source

Define a getter, e.g. object.creator

# File lib/redcrumbs/serializable_association.rb, line 47
def define_getter_for(name)
  define_method("#{name}") do
    instance_variable_get("@#{name}") or
    instance_variable_set("@#{name}", deserialize(name)) or
    instance_variable_set("@#{name}", load_associated(name))
  end
end
define_load_state_getter(name) click to toggle source

Define method to check if association has been fully loaded from the database.

# File lib/redcrumbs/serializable_association.rb, line 74
def define_load_state_getter(name)
  instance_variable_set("@#{name}_load_state", false)

  define_method("has_loaded_#{name}?") do
    instance_variable_get("@#{name}_load_state")
  end
end
define_loader_for(name) click to toggle source

Define method to force a load of the association from the database or return it if already loaded.

# File lib/redcrumbs/serializable_association.rb, line 59
def define_loader_for(name)
  define_method("full_#{name}") do
    if send("has_loaded_#{name}?")
      instance_variable_get("@#{name}")
    else
      instance_variable_set("@#{name}_load_state", true)
      instance_variable_set("@#{name}", load_associated(name))
    end
  end
end
define_setter_for(name) click to toggle source

Define a setter, e.g. object.creator=

# File lib/redcrumbs/serializable_association.rb, line 34
def define_setter_for(name)
  define_method("#{name}=") do |associated|
    instance_variable_set("@#{name}".to_sym, associated)

    assign_id_for(name, associated)
    assign_type_for(name, associated)
    assign_serialized_attributes(name, associated)
  end
end