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
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.
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
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.
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.
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
class Task < ActiveRecord::Base belongs_to :project, counter_cache: true end
Now counter caching is enabled.
Further reading on the Rails Guides