module BelongsToRemote::ClassMethods

Public Instance Methods

belongs_to_remote(name, options = {}) click to toggle source

Defines private instance method for one-to-one association with ActiveResource::Base (or ActiveRecord::Base). Model should have the foreign key attribute (default is “#{name}_id”). For polymorphic association model should also have foreign type attribute (default is “#{name}_type”), which contains class name of association model.

Params:

- name {Symbol} of the association
- options {Hash}, :class_name, :foreign_key, :polymorphic

Defined method returns nil if none is found.

# File lib/belongs_to_remote.rb, line 22
def belongs_to_remote(name, options = {})
  name.to_s.split('_').each(&:capitalize!).join
  if options[:polymorphic]
    class_eval %(
      def #{name}
        return nil unless self.#{name.to_s + "_type"} && self.#{options[:foreign_key] || name.to_s + "_id" }
        @#{name} ||= Object.const_get(self.#{name.to_s + "_type"}).find(self.#{options[:foreign_key] || name.to_s + "_id" }) rescue nil
      end

      def #{name}=(object)
        self.#{options[:foreign_key] || name.to_s + "_id" } = object ? object.__send__(object.class.respond_to?(:primary_key) ? object.class.primary_key.to_sym : :id) : nil
        self.#{name.to_s + "_type"} = object ? object.class.to_s : nil
      end
    )
  else
    class_eval %(
      def #{name}
        return nil unless self.#{options[:foreign_key] || name.to_s + "_id" }
        @#{name} ||= #{options[:class_name] || name.to_s.split('_').each(&:capitalize!).join}.find(self.#{options[:foreign_key] || name.to_s + "_id" }) rescue nil
      end

      def #{name}=(object)
        self.#{options[:foreign_key] || name.to_s + "_id" } = object ? object.__send__(object.class.respond_to?(:primary_key) ? object.class.primary_key.to_sym : :id) : nil
      end
    )
  end
end