The GitHub Repo
The Heroku App
Rails 4.1.0rc1
This episode I wanted to try out the new 4.1.0rc1 version of rails. I had a weird issue when I tried to enter the rails console
when I had pg
install and marked into the production group like so
gem 'sqlite3', group: :development
gem 'pg', group: :production
I entered rails c
and got
Could not find pg-0.17.1 in any of the sources
Run `bundle install` to install missing gems.
Even after I ran bundle install
and the output says I have it installed, I was unable to enter the console. I temporarily commented it out in order to work on the actual project. After I was finished with the project, I went to prepare the project to be hosted on Heroku. I uncommented the pg
line, then tried bundle install
again. This time I was able to enter rails console
without any projects. I was in another tab this time. I’m not completely sure why this happened, but my best guess is that bash or rvm didn’t load completely in the tab I was attempting to run rails c
on. Embarrassingly enough, I actually opened an issue on GitHub on the Rails repo.
Create records with seed.rb
I populated the database using the seed.rb. Instead of declaring each record one by one, I did it dynamically with ruby. More in the blog post.
Counter Cache
The concept this episode was adding a counter cache column to the the projects table. This allows us to call project.tasks_count
instead of project.tasks.count
. The latter is inefficient because the database not only returns the projects, but also all the tasks associated with that task. The former improves performance by allowing us to only send the projects’ object which contains the tasks_count
attribute.
The Migration
The migration wasn’t too different from what I’ve seen before, but there were a few things to take note of.
class AddTasksCount < ActiveRecord::Migration
def self.up
add_column :projects, :tasks_count, :integer, default: 0
Project.reset_column_information
Project.all.each do |p|
Project.update p.id, tasks_count: p.tasks.length
end
end
def self.down
remove_column :projects, :tasks_count
end
end
There is a default value on the tasks_count
column. This default value allows us to increment and decrement when new tasks are added or deleted for each given project.
reset_column_information
According to the Ruby on Rails API the reset_column_information
method resets the cached information about a column. This is useful because if you didn’t run reset_column_information
, then the update
of the tasks_count
could be incorrect.
Update()
The update() accepts two arguments an id
and an attribute. The attribute could be a hash. So p.id
designates the correct project while tasks_count: p.tasks.length
updates the tasks_count
column with the correct value.
Counter Cache: true
Finally you add counter_cache: true
in the task.rb
class Task < ActiveRecord::Base
belongs_to :project, counter_cache: true
end
Now counter caching is enabled.
Further reading on the Rails Guides