denyago/remote_association

View on GitHub
lib/remote_association.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "active_record"
require "active_support"

require "remote_association/version"
require "remote_association/has_one_remote"
require "remote_association/has_many_remote"
require "remote_association/belongs_to_remote"
require "remote_association/active_record/relation"

module RemoteAssociation

  # Include this class to hav associations to ActiveResource models
  #
  # It will add methods to your class:
  # * <tt>has_one_remote(name, *options)</tt>
  # * <tt>has_many_remote(name, *options)</tt>
  # * <tt>activeresource_relations</tt>
  # * <tt>add_activeresource_relation(name, options)</tt>
  module Base
    def self.included(base)
      base.extend ClassMethods
      base.send :include, InstanceMethods

      base.class_eval do
      end
    end

    module ClassMethods
      include RemoteAssociation::HasOneRemote
      include RemoteAssociation::HasManyRemote
      include RemoteAssociation::BelongsToRemote

      # Adds settings of relation to ActiveResource model.
      #
      # === Parameters
      # * <tt>name</tt> a Symbol, representing name of association
      # * <tt>options</tt> a Hash, contains :class_name and :foreign_key settings
      #
      # === Examples
      #
      # Author.add_activeresource_relation(:profile, {class_name: "Profile", foreign_key: "author_id"})
      def add_activeresource_relation(name, options)
        activeresource_relations[name] = options
      end

      # Returns settings for relations to ActiveResource models.
      #
      # === Examples
      #
      # Author.activeresource_relations #=>
      #   {
      #     profile: {class_name: "Profile", foreign_key: "author_id"},
      #     badges: {class_name: "Badge", foreign_key: "author_id"}
      #   }
      def activeresource_relations
        @activeresource_relations ||= {}
      end
    end

    module InstanceMethods

      # Returns <tt>true</tt> if associations to remote relations already loaded and set
      def remote_resources_loaded?
        @remote_resources_loaded
      end
    end
  end

  class SettingsNotFoundError < StandardError; end
end