Method: Sohm::Model.reference

Defined in:
lib/sohm.rb

.reference(name, model) ⇒ Object

A macro for defining an attribute, an index, and an accessor for a given model.

Example:

class Post < Sohm::Model
  reference :user, :User
end

# It's the same as:

class Post < Sohm::Model
  attribute :user_id
  index :user_id

  def user
    User[user_id]
  end

  def user=(user)
    self.user_id = user.id
  end

  def user_id=(user_id)
    self.user_id = user_id
  end
end


751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
# File 'lib/sohm.rb', line 751

def self.reference(name, model)
  reader = :"#{name}_id"
  writer = :"#{name}_id="

  attributes << reader unless attributes.include?(reader)

  index reader

  define_method(reader) do
    @attributes[reader]
  end

  define_method(writer) do |value|
    @attributes[reader] = value
  end

  define_method(:"#{name}=") do |value|
    send(writer, value ? value.id : nil)
  end

  define_method(name) do
    model = Utils.const(self.class, model)
    model[send(reader)]
  end
end