FlattenRecord

An ActiveRecord plugin that denormalizes your existing ActiveRecord models.
It provides an easier way to create denormalized records to be used for reporting, includes generation of migration file.
Usage
Add gem dependency
gem 'flatten_record'
Include module in your newly defined model
include FlattenRecord::Flattener
Define denormalization
class DenormalizedOrder < ActiveRecord::Base
include FlattenRecord::Flattener
denormalize :order, {
include: {
# :belongs_to association
customer: {}
# :has_many association, create multiple denormalized records
line_items: {}
},
methods: {
# save methods defined in Normalized model
total_in_usd: :decimal
},
compute: {
# compute methods defined in Denormalized model
line_items_sum: { type: :decimal, default: 0 }
}
}
private
def compute_line_items_sum(order)
order.line_items.collect(&:total).inject(:+)
end
end
class Order < ActiveRecord::Base
def total_in_usd
# calculation
end
end
Generate migration file
Generate migration file based on the definition
$ rails generate flatten_record:migration denormalized_order
create db/migrate/20140313034700_create_table_denormalized_orders.rb
Update definition and generate new migration file
$ rails generate flatten_record:migration denormalized_order
Warning. Table already exists: denormalized_orders
migration based on the difference..
Add columns: d_line_items_description
create db/migrate/20140313034736_add_d_line_items_description_to_denormalized_orders.rb
Use denormalizer methods
Create record
irb(main)> DenormalizedOrder.create_with(order)
Deleting record(s)
irb(main)> DenormalizedOrder.destroy_with(order)
Update record(s)
irb(main)> DenormalizedOrder.update_with(order)
Design & Documentation
Refer to the wiki.
Versions
v1
- tree-based denormalization: nicer code & structure √
- new DSL + syntax √
(Credit to @scottharvey's issue #6) - added :prefix option - use your own column prefix √
- added :methods option - save normalized model's method √
(Credit to @scottharvey's idea) - change to old :save option to :compute option √
(Credit to @scottharvey's idea) - deprecate observer √
v0
- denormalize fields and nested fields √
- denormalize belongs_to, has_many typed associations √
- generate migration from denormalized model √
- observe model changes and update denormalized model √
Contributors
License
see MIT-LICENSE.