Software, Development, Ruby and Internet > Marc Anguera Insa

04/06/2013

Introducing Unscoped Associations

Ruby on Rails is a great framework with a lot of interesting options. One of them is the ability to collect instances of a particular class using default_scope. Very useful to collect “scoped” data by default, but pulling objects via associations is also affected.

It may be that you’ve ever needed to skip the default_scope (for some strange reasons). This library allows you to do it easily.

Supported associations:

  • :belongs_to
  • :has_one
  • :has_many

More information, source and follow up here.

Installation

Add this line to your Gemfile:


gem 'unscoped_associations'

Scenario usage

From now on you are able to use unscoped option in your association definitions. Basic usage example:

class User < ActiveRecord::Base
  has_many :comments # or , unscoped: false
  has_many :all_comments, class_name: 'Comment',
                          unscoped: true
  has_one  :last_comment, class_name: 'Comment',
                          order: 'created_at DESC',
                          unscoped: true

  default_scope where( active: true )
end

class Comment < ActiveRecord::Base
  belongs_to :user, unscoped: true

  default_scope where( public: true )
end

@user.comments # => return public comments
@user.all_comments # => return all comments skipping default_scope
@user.last_comment # => return last comment skipping default_scope
@comment.user # => return user w/o taking account 'active' flag

Status

Tested on Rails 3.x series and Rails 4.0.0. Originally thought and built for Rails 3, Rails 4 supported.

NOTE: Rails 4 introduces some updates (and more planned for upcoming releases) related to this part. For example, in Rails 4, you are able to customize associations using a scope block, so you can skip default_scope:

class User < ActiveRecord::Base
  has_many :all_comments, -> { where public: [true, flase] }, class_name: 'Comment'
end

Anyway, you can use unscoped option, if you prefer.

Contributing

Feel free to fork, send ideas, bugs or any comment.