module ActiveRecord::SpawnMethods
Public Instance Methods
except(*skips)
click to toggle source
Removes from the query the condition(s) specified in skips
.
Post.order('id asc').except(:order) # discards the order condition Post.where('id > 10').order('id asc').except(:where) # discards the where condition but keeps the order
# File lib/active_record/relation/spawn_methods.rb, line 59 def except(*skips) relation_with values.except(*skips) end
merge(other, *rest)
click to toggle source
Merges in the conditions from other
, if other
is an ActiveRecord::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
.
# File 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
only(*onlies)
click to toggle source
Removes any condition from the query other than the one(s) specified in onlies
.
Post.order('id asc').only(:where) # discards the order condition Post.order('id asc').only(:where, :order) # uses the specified order
# File lib/active_record/relation/spawn_methods.rb, line 67 def only(*onlies) relation_with values.slice(*onlies) end
Private Instance Methods
relation_with(values)
click to toggle source
# File lib/active_record/relation/spawn_methods.rb, line 72 def relation_with(values) result = spawn result.instance_variable_set(:@values, values) result end