GIANT ROBOTS SMASHING INTO OTHER GIANT ROBOTS

Written by thoughtbot

what

Here’s one that might get you Rails developers:


class Comment < ActiveRecord::Base

  def before_create
    self.spam = false
  end

end

Schema:


  comments (id, spam)

The above model was in an app that allowed site administrators the ability to flag a Comment as spam. Naturally, this mapped to a boolean column in the comments table.

However, no Comment was ever being saved.

Why?

In Rails, if any ActiveRecord callback returns false the model will NOT be saved.

The solution is to put the spam column’s default value of false for all newly created Comment’s in the Comment model’s migration:


class CreateComments < ActiveRecord::Migration

  def self.up
    create_table :comments do |t|
      t.column :spam, :boolean, :default => false
    end
  end

  def self.down
    drop_table :comments
  end

end

This is one instance were a domain ‘constraint’, if you can call it that, has to go in the database and not in the model.

I love stuff like this.