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.