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