module ActiveModel::Embedding::Collecting

Attributes

document_class[R]
documents[R]
to_a[R]
to_ary[R]

Public Class Methods

new(documents) click to toggle source
# File lib/active_model/embedding/collecting.rb, line 12
def initialize(documents)
  @documents      = documents
  @document_class = documents.first.class
end

Public Instance Methods

<<(*new_documents)
Alias for: push
==(other) click to toggle source
# File lib/active_model/embedding/collecting.rb, line 103
def ==(other)
  documents.map(&:attributes) == other.map(&:attributes)
end
append(*new_documents)
Alias for: push
as_json() click to toggle source
# File lib/active_model/embedding/collecting.rb, line 95
def as_json
  documents.as_json
end
attributes=(documents_attributes) click to toggle source
# File lib/active_model/embedding/collecting.rb, line 17
def attributes=(documents_attributes)
  documents_attributes = sanitize_for_mass_assignment(documents_attributes)

  case documents_attributes
  when Hash
    documents_attributes.each do |index, document_attributes|
      index    = index.to_i
      id       = fetch_id(document_attributes) || index
      document = find_by_id id if id

      unless document
        document = documents[index] || build
      end

      document.attributes = document_attributes
    end
  when Array
    documents_attributes.each do |document_attributes|
      id       = fetch_id(document_attributes)
      document = find_by_id id if id

      unless document
        document = build
      end

      document.attributes = document_attributes
    end
  else
    raise_attributes_error
  end
end
build(attributes = {}) click to toggle source
# File lib/active_model/embedding/collecting.rb, line 53
def build(attributes = {})
  case attributes
  when Hash
    document = document_class.new(attributes)

    append document

    document
  when Array
    attributes.map do |document_attributes|
      build(document_attributes)
    end
  else
    raise_attributes_error
  end
end
each() { |document| ... } click to toggle source
# File lib/active_model/embedding/collecting.rb, line 89
def each
  return self.to_enum unless block_given?

  documents.each { |document| yield document }
end
find_by_id(id) click to toggle source
# File lib/active_model/embedding/collecting.rb, line 49
def find_by_id(id)
  documents.find { |document| document.id == id }
end
push(*new_documents) click to toggle source
# File lib/active_model/embedding/collecting.rb, line 70
def push(*new_documents)
  new_documents = new_documents.flatten

  valid_documents = new_documents.all? { |document| document.is_a? document_class }

  unless valid_documents
    raise ArgumentError, "Expect arguments to be of class #{document_class}"
  end

  @documents.push(*new_documents)
end
Also aliased as: <<, append
save() click to toggle source
# File lib/active_model/embedding/collecting.rb, line 85
def save
  documents.all?(&:save)
end
to_json() click to toggle source
# File lib/active_model/embedding/collecting.rb, line 99
def to_json
  as_json.to_json
end

Private Instance Methods

fetch_id(attributes) click to toggle source
# File lib/active_model/embedding/collecting.rb, line 109
def fetch_id(attributes)
  attributes["id"].to_i
end
raise_attributes_error() click to toggle source
# File lib/active_model/embedding/collecting.rb, line 113
def raise_attributes_error
  raise ArgumentError, "Expect attributes to be a Hash or Array, but got a #{attributes.class}"
end