dewski / active_denormalize

ActiveDenormalize is a gem that allows you to denormalize data across your ActiveRecord models.

Home Page:https://rubygems.org/gems/active_denormalize

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ActiveDenormalize

ActiveDenormalize is a gem that allows you to denormalize data across your ActiveRecord models. It currently supports belongs_to relationships.

Below is a simple example which you can use to get started (and mostly until further documentation is added in this README).

class Product < ApplicationRecord
  has_many :inventory_checks
end

class InventoryCheck < ApplicationRecord
  belongs_to :product, denormalize: true
end

ActiveDenormalize works by adding create, update, and destroy after_*_commit callbacks to the host model, in this case InventoryCheck, which will update the denormalized attributes on the Product model.

To know which attributes to denormalize on to the Product model, ActiveDenormalize will look for inventory_check prefixed columns on the Product model. For example, if you have a inventory_check_id column on the Product model, ActiveDenormalize will update that column with the ID of most recent InventoryCheck record that belong to the Product.

# No InventoryCheck has been created yet
> product = Product.create(name: "Product 1")
> product.inventory_check_id
=> nil
> product.inventory_check_created_at
=> nil
> product.inventory_check_status
=> nil
> product.inventory_check_denormalized_at
=> nil

# Updates the Product record to know about the newest InventoryCheck
> first_inventory_check = InventoryCheck.create(product: product, status: "backordered")
> first_inventory_check.id
=> 1
> product.reload.inventory_check_id
=> 1
> product.inventory_check_created_at
=> Sun, 17 Sep 2023 17:28:13.674818427 UTC +00:00
> product.inventory_check_status
=> "backordered"
> product.inventory_check_denormalized_at
=> Sun, 17 Sep 2023 17:28:13.674818427 UTC +00:00

# Updates the Product record to know about the newest InventoryCheck
> second_inventory_check = InventoryCheck.create(product: product, status: "available")
> second_inventory_check.id
=> 2
> product.reload.inventory_check_id
=> 2
> product.inventory_check_created_at
=> Sun, 17 Sep 2023 17:28:53.903842001 UTC +00:00
> product.inventory_check_status
=> "available"
> product.inventory_check_denormalized_at
=> Sun, 17 Sep 2023 17:28:53.903842001 UTC +00:00
> second_inventory_check.destroy

# Reverts to the previous InventoryCheck record
> product.reload.inventory_check_id
=> 1
> product.inventory_check_created_at
=> Sun, 17 Sep 2023 17:28:13.674818427 UTC +00:00
> product.inventory_check_status
=> "backordered"
> product.inventory_check_denormalized_at
=> Sun, 17 Sep 2023 17:28:13.674818427 UTC +00:00

# Updates the denormalized representation of the InventoryCheck on Product
> first_inventory_check.update!(status: "available")
> product.reload.inventory_check_id
=> 1
> product.inventory_check_created_at
=> Sun, 17 Sep 2023 17:28:13.674818427 UTC +00:00
> product.inventory_check_status
=> "available"
> product.inventory_check_denormalized_at # This timestamp will be updated
=> Sun, 17 Sep 2023 17:31:16.388224345 UTC +00:00

Installation

Add this line to your application's Gemfile:

gem "active_denormalize"

And then execute:

$ bundle

Or install it yourself as:

$ gem install active_denormalize

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/active_denormalize. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the code of conduct.

License

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

About

ActiveDenormalize is a gem that allows you to denormalize data across your ActiveRecord models.

https://rubygems.org/gems/active_denormalize

License:MIT License


Languages

Language:Ruby 81.7%Language:HTML 18.2%Language:CSS 0.1%