123456789_123456789_123456789_123456789_123456789_

Module: ActiveRecord::SpawnMethods

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Included In:
Defined in: activerecord/lib/active_record/relation/spawn_methods.rb

Instance Method Summary

Instance Method Details

#except(*skips)

Removes the condition(s) specified in skips from the query.

Post.order('id asc').except(:order)                  # removes the order condition
Post.where('id > 10').order('id asc').except(:where) # removes the where condition but keeps the order
[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/spawn_methods.rb', line 59

def except(*skips)
  relation_with values.except(*skips)
end

#merge(other, *rest)

Merges in the conditions from other, if other is an Relation. Returns an array representing the intersection of the resulting records with other, if other is an array.

Post.where(published: true).joins(:comments).merge( Comment.where(spam: false) )
# Performs a single join query with both where conditions.

recent_posts = Post.order('created_at DESC').first(5)
Post.where(published: true).merge(recent_posts)
# Returns the intersection of all published posts with the 5 most recently created posts.
# (This is just an example. You'd probably want to do this with a single query!)

Procs will be evaluated by merge:

Post.where(published: true).merge(-> { joins(:comments) })
# => Post.where(published: true).joins(:comments)

This is mainly intended for sharing common conditions between multiple associations.

For conditions that exist in both relations, those from other will take precedence. To find the intersection of two relations, use QueryMethods#and.

[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/spawn_methods.rb', line 33

def merge(other, *rest)
  if other.is_a?(Array)
    records & other
  elsif other
    spawn.merge!(other, *rest)
  else
    raise ArgumentError, "invalid argument: #{other.inspect}."
  end
end

#merge!(other, *rest)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/spawn_methods.rb', line 43

def merge!(other, *rest) # :nodoc:
  if other.is_a?(Hash)
    Relation::HashMerger.new(self, other).merge
  elsif other.is_a?(Relation)
    Relation::Merger.new(self, other).merge
  elsif other.respond_to?(:to_proc)
    instance_exec(&other)
  else
    raise ArgumentError, "#{other.inspect} is not an ActiveRecord::Relation"
  end
end

#only(*onlies)

Keeps only the condition(s) specified in onlies in the query, removing all others.

Post.order('id asc').only(:where)         # keeps only the where condition, removes the order
Post.order('id asc').only(:where, :order) # keeps only the where and order conditions
[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/spawn_methods.rb', line 67

def only(*onlies)
  relation_with values.slice(*onlies)
end

#relation_with(values) (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/spawn_methods.rb', line 72

def relation_with(values)
  result = spawn
  result.instance_variable_set(:@values, values)
  result
end

#spawn

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/relation/spawn_methods.rb', line 9

def spawn # :nodoc:
  already_in_scope?(model.scope_registry) ? model.all : clone
end