Module: ActiveRecord::SpawnMethods
- Included in:
- Relation
- Defined in:
- lib/active_record/relation/spawn_methods.rb
Instance Method Summary collapse
-
#except(*skips) ⇒ Object
Removes the condition(s) specified in
skipsfrom the query. -
#merge(other, *rest) ⇒ Object
Merges in the conditions from
other, ifotheris an ActiveRecord::Relation. -
#merge!(other, *rest) ⇒ Object
:nodoc:.
-
#only(*onlies) ⇒ Object
Keeps only the condition(s) specified in
onliesin the query, removing all others. -
#spawn ⇒ Object
:nodoc:.
Instance Method Details
#except(*skips) ⇒ Object
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
59 60 61 |
# File 'lib/active_record/relation/spawn_methods.rb', line 59 def except(*skips) relation_with values.except(*skips) end |
#merge(other, *rest) ⇒ Object
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.
33 34 35 36 37 38 39 40 41 |
# 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 |
#merge!(other, *rest) ⇒ Object
:nodoc:
43 44 45 46 47 48 49 50 51 52 53 |
# File '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) ⇒ Object
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
67 68 69 |
# File 'lib/active_record/relation/spawn_methods.rb', line 67 def only(*onlies) relation_with values.slice(*onlies) end |
#spawn ⇒ Object
:nodoc:
9 10 11 |
# File 'lib/active_record/relation/spawn_methods.rb', line 9 def spawn # :nodoc: already_in_scope?(model.scope_registry) ? model.all : clone end |