method

merge

rails latest stable - Class: ActiveRecord::SpawnMethods
merge(other, *rest)
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.

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

1Note

Makes it possible to use a scope through an association

noniq ยท Mar 27, 20125 thanks

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.