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
-
#except(*skips)
Removes the condition(s) specified in
skips
from the query. -
#merge(other, *rest)
Merges in the conditions from
other
, ifother
is anRelation
. -
#only(*onlies)
Keeps only the condition(s) specified in
onlies
in the query, removing all others. - #relation_with(values) private
- #merge!(other, *rest) Internal use only
- #spawn Internal use only
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
# 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.
#merge!(other, *rest)
# 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
# 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
# File 'activerecord/lib/active_record/relation/spawn_methods.rb', line 9
def spawn # :nodoc: already_in_scope?(model.scope_registry) ? model.all : clone end