Skip to content

tomas-stefano/machinist-caching

Repository files navigation

Machinist-Caching

Machinist with the object-caching feature

When you create an object with make!, Machinist-caching keeps the object around in the database. If, in a later test, you request an identical object, Machinist will give you the cached copy. This is a big performance win, particularly when creating objects in the setup for a group of tests.

Installation

gem install machinist-caching

Usage

    require 'machinist/caching/active_record'

    # Test::Unit
    class Test::Unit::TestCase
      def setup
        Machinist::Caching::Shop.instance.reset!
      end
    end

    # RSpec
    RSpec.configure do |config|
      config.before do
        Machinist::Caching::Shop.instance.reset!
      end
    end

Problem Scenario

Imagine that you have countries, states and cities model. And you have this blueprints:

    Country.blueprint(:brasil) do
      name { 'Brasil sil sil!!' }
    end

    State.blueprint(:minas_gerais) do
      acronym { 'MG' }
      name    { 'Minas Gerais' }
      country { Country.make!(:brasil) }
    end

    State.blueprint(:rio_grande_do_sul) do
      acronym { 'RS' }
      name    { 'Rio Grande do Sul' }
      country { Country.make!(:brasil) }
    end

    City.blueprint(:belo_horizonte) do
      digit { 1 }
      name  { 'Belo Horizonte' }
      state { State.make!(:minas_gerais) }
    end

    City.blueprint(:porto_alegre) do
      digit { 1 }
      name  { 'Porto Alegre' }
      state { State.make!(:rio_grande_do_sul) }
    end

And you have some validations in the models:

    class Country < ActiveRecord::Base
      validates :name, presence: true, uniqueness: { allow_blank: true }
    end

    class State < ActiveRecord::Base
      validates :name, presence: true, uniqueness: { allow_blank: true }
    end

    class City < ActiveRecord::Base
      validates :name, presence: true, uniqueness: { allow_blank: true }
    end

Instead of you writing this to create a city

    brasil = Country.make!(:brasil)

    minas_gerais = State.make!(:minas_gerais, country: brasil)
    rio_grande_do_sul = State.make!(:rio_grande_do_sul, country: brasil)

    City.make!(:belo_horizonte, state: minas_gerais)
    City.make!(:porto_alegre, state: rio_grande_do_sul)

With machinist-caching you can do this:

    City.make!(:belo_horizonte)
    City.make!(:porto_alegre)

Profit!

:)