Module: StElsewhere

Defined in:
lib/st-elsewhere.rb

Instance Method Summary collapse

Instance Method Details

#associations_to_association_ids(associations) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/st-elsewhere.rb', line 111

def associations_to_association_ids(associations)
  ids = []
  if associations && !associations.empty?
    associations.reject!{|a| a.to_s.empty? }
    association_class = associations.first.class.to_s
    ids = case association_class
          when "String"
            associations.map{|a| a.to_i }
          when "Fixnum"
            associations
          else
            associations.map{|a| a.id}
    end
  end
  ids
end

#has_many_elsewhere(association_id, options = {}, &extension) ⇒ Object

Specifies a one-to-many association across database connections. This is currently an incomplete implementation and does not yet use all of the options supported by has_many

The following methods for retrieval and query of collections of associated objects will be added:

collection=objects

Replaces the collections content by deleting and adding objects as appropriate.

collection_singular_ids

Returns an array of the associated objects’ ids

collection_singular_ids=ids

Replace the collection with the objects identified by the primary keys in ids

collection.empty?

Returns true if there are no associated objects.

collection.size

Returns the number of associated objects.

(Note: collection is replaced with the symbol passed as the first argument, so has_many :clients would add among others clients.empty?.)

Example

Example: A Firm class declares has_many_elsewhere :clients, which will add:

  • Firm#clients (similar to Clients.find :all, :conditions => ["firm_id = ?", id])

  • Firm#clients=

  • Firm#client_ids

  • Firm#client_ids=

  • Firm#clients.empty? (similar to firm.clients.size == 0)

  • Firm#clients.size (similar to Client.count "firm_id = #{id}")

Supported options

:through

Specifies a Join Model through which to perform the query. You can only use a :through query through a belongs_to has_one or has_many association on the join model.

:class_name

Specifies a the class name to use for the association, rather than inferring from the association name.

Option examples:

has_many_elsewhere :subscribers, :through => :subscriptions
has_many_elsewhere :subscribers, :through => :subscriptions, :class_name => 'User'

Raises:

  • (ArgumentError)


43
44
45
46
47
48
# File 'lib/st-elsewhere.rb', line 43

def has_many_elsewhere(association_id, options = {}, &extension)
  association_class = (options[:class_name] || association_id.to_s).classify.constantize
  through = options[:through]
  raise ArgumentError.new("You must include :through => association for has_many_elsewhere") if not through
  collection_accessor_methods_elsewhere(association_id, association_class, through)
end