Back in the 80's disk space was precious. That's why we came out with table "normalization" for relational databases.
While this concept is still valid, disk space has become ridicously cheap, and, there's a lot of cases where performance is more important than disk space.
Can't you just use eager loading?
You could! But, eager loading still loads the models into memory. Such a memory waste, specially if the parent models are big.
Add this line to your application's Gemfile:
And then execute:
Or install it yourself as:
$ gem install cached_belongs_to
Currently, it works with a traditional
between two models.
Just use it as you would normally use
belongs_to. Add the
:caches option to specify the
fields in the association that you want to cache.
# # table: authors # name:string # class Author has_many :books end # # table: books # author_id:integer # author_name:string # class Book cached_belongs_to :author, :caches => :name end
You will need a database field in the books table to hold the cached value:
class AddCachedBelongsToBooks < ActiveRecord::Migration def change add_column :books, :author_name, :string end end
And, that's it. Everytime you hange the Author, it will come back and update the cached fields on the Book model.
So, now on your views you can just call:
And won't pay the price of loading the whole Author model in memory, nor the query time.
- Fork it
- Create your feature branch (
git checkout -b my-new-feature)
- Commit your changes (
git commit -am 'Add some feature')
- Push to the branch (
git push origin my-new-feature)
- Create new Pull Request
About the Author
Crowd Interactive is an American web design and development company that happens to work in Colima, Mexico. We specialize in building and growing online retail stores. We don’t work with everyone – just companies we believe in. Call us today to see if there’s a fit. Find more info here!