Skip to content

Latest commit

 

History

History
111 lines (79 loc) · 2.44 KB

README.md

File metadata and controls

111 lines (79 loc) · 2.44 KB

null_association

CI Gem Version

Use null_association to utilize the null object pattern with Active Record associations.

This gem was extracted from Keygen.

Sponsored by:

Keygen

A fair source software licensing and distribution API.

Installation

Add this line to your application's Gemfile:

gem 'null_association'

And then execute:

$ bundle

Or install it yourself as:

$ gem install null_association

Usage

To use a null object, define an optional singular association and use the null_object: keyword, which accepts a class name, a class, or an instance. When the association is nil, the null object will be returned instead.

class NullObject
  include Singleton

  def present? = false
  def blank?   = true
end
class NullPlan < NullObject
  def name  = 'Free'
  def free? = true
  def pro?  = false
  def ent?  = false
end
class NullBilling < NullObject
  def subscribed? = true
  def trialing?   = false
  def canceled?   = false
end
class Account
  belongs_to :plan, optional: true, null_object: NullPlan.instance
  has_one :billing, null_object: NullBilling.instance
end
account = Account.create(plan: nil)

puts account.plan       # => #<NullPlan name="Free">
puts account.plan.free? # => true
puts account.plan.ent?  # => false

account.update(plan: Plan.new(name: 'Ent', ent: true))

puts account.plan       # => #<Plan id=1 name="Ent">
puts account.plan.free? # => false
puts account.plan.ent?  # => true

Supported Rubies

null_association supports Ruby 3.1 and above. We encourage you to upgrade if you're on an older version. Ruby 3 provides a lot of great features, like better pattern matching and a new shorthand hash syntax.

Is it any good?

Yes.

Contributing

If you have an idea, or have discovered a bug, please open an issue or create a pull request.

License

The gem is available as open source under the terms of the MIT License.