method
merge
v4.2.1 -
Show latest stable
- Class:
ActiveRecord::SpawnMethods
merge(other)public
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.
1Note
Makes it possible to use a scope through an association
This is a very useful method if you want to to use a scope through an association:
class Book < ActiveRecord::Base
scope :available, where(:available => true)
end
class Author < ActiveRecord::Base
has_many :books
scope :with_available_books, joins(:books).merge(Book.available)
end
# Return all authors with at least one available book:
Author.with_available_books
See http://asciicasts.com/episodes/215-advanced-queries-in-rails-3 for more info.