# Mongoid::Max::Denormalize `Mongoid::Max::Denormalize` is a denormalization extension for Mongoid. It was designed to do a minimum number of queries to the database. * Denormalize fields * Denormalize methods (only in One to Many situations for now) * Denormalize `count` in Many to One situations * Propagate only when needed: * for fields: when there are actual changes * for methods: always (we can't know in an inexpensive way what is the old value to figure out if there is a change) * Take advantage of atomic operations on multiple documents of MongoDB **Versions supported:** Mongoid 3.0 and Mongoid 2.4 [![Continuous Integration status](https://secure.travis-ci.org/maximeg/mongoid_max_denormalize.png)](http://travis-ci.org/maximeg/mongoid_max_denormalize) ## Installation Add the gem to your Gemfile: gem 'mongoid_max_denormalize' Or install with RubyGems: $ gem install mongoid_max_denormalize ## Usage ### Basic usage Add `include Mongoid::Max::Denormalize` in your model and also: ```ruby denormalize :relation, :field_1, :field_2 ... :field_n, :options_1 => :value, :options_2 => :value ``` ### Warming up If there are existing records prior to the denormalization setup, you have to warm up. See below for each relation type. Note: you can't warm up from both sides of the relation. Only the most efficient is available. ### One to Many **Supported fields:** normal Mongoid fields, and methods. **Supported options:** none. #### Example: ```ruby class Post include Mongoid::Document field :title def slug title.try(:parameterize) end has_many :comments end class Comment include Mongoid::Document include Mongoid::Max::Denormalize belongs_to :post denormalize :post, :title, :slug end @post = Post.create(:title => "Mush from the Wimp") @comment = @post.comments.create @comment.post_title #=> "Mush from the Wimp" @comment.post_slug #=> "mush-from-the-wimp" @post.update_attributes(:title => "All Must Share The Burden") @comment.reload # to reload the comment from the DB @comment.post_title #=> "All Must Share The Burden" @comment.post_slug #=> "all-must-share-the-burden" ``` To warm up the denormalization for an existing collection: ```ruby Post.denormalize_to_comments! ``` **Tips :** In your views, do not use `@comment.post` but `@comment.post_id` or `@comment.post_id?` to avoid a query that checks/retrieve for the post. We want to avoid it, don't we ? Exemple : Check your logs, you'll see queries for the post : # app/views/comments/_comment.html.erb