A log of all the stupid mistakes I make while learning rails. Maybe someone will find them useful.

Contents

[edit] ActiveRecord initialize

DO NOT Override the initialize method of ActiveRecord. It only causes problems!

[edit] Serializing an array of custom classes =

class Board < ActiveRecord::Base
  # The next line is necessary if you want @pegs to unserialize
  #  in the expected manner. If you don't have it, YAML won't know
  #  what class the items in the array should be.
  require 'board_peg'
  serialize :pegs
  
  def setup_board
    self.pegs = [BoardPeg.new, BoardPeg.new, BoardPeg.new]
  end
end

class BoardPeg
  ...
end

[edit] Associations w/o default names

If you decide to override the default name of a has_one/has_many and belongs_to relationship, you CAN NOT just do this:

class Person < ActiveRecord::Base
  has_one :car, :class_name => "Vehicle"

class Vehicle < ActiveRecord::Base
  belongs_to :driver, :class => "Person"

You MUST include foreign keys like so:


class Person < ActiveRecord::Base
  has_one :car, :class_name => "Vehicle", :foreign_key => "person_id"

class Vehicle < ActiveRecord::Base
  belongs_to :driver, :class => "Person", :foreign_key => "person_id"

[edit] [] and []= overrides inside a model

If you get an error like this:

   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/associations/association_proxy.rb:177:in `[]'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/associations/association_proxy.rb:177:in `send'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/associations/association_proxy.rb:177:in `method_missing'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/associations.rb:795:in `has_one_after_save_for_board'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/callbacks.rb:173:in `send'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/callbacks.rb:173:in `evaluate_method'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/callbacks.rb:161:in `call'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/callbacks.rb:93:in `run'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/callbacks.rb:92:in `each'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/callbacks.rb:92:in `send'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/callbacks.rb:92:in `run'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/callbacks.rb:272:in `run_callbacks'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/callbacks.rb:298:in `callback'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/callbacks.rb:208:in `create_or_update'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/base.rb:2206:in `save_without_validation!'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/validations.rb:911:in `save_without_dirty!'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/dirty.rb:83:in `save_without_transactions!'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/transactions.rb:110:in `save!'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/connection_adapters/abstract/database_statements.rb:66:in `transaction'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/transactions.rb:79:in `transaction'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/transactions.rb:98:in `transaction'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/transactions.rb:110:in `save!'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/transactions.rb:118:in `rollback_active_record_state!'
   C:/instantrails/ruby/lib/ruby/gems/1.8/gems/activerecord-2.1.0/lib/active_record/transactions.rb:110:in `save!'
   app/models/adventure_game.rb:145:in `compute_results_and_complete_round!'
   app/models/adventure_game.rb:122:in `advance_phase!'

This will occur when you try to .save! a model that has something like this in it:

 def [](row, col)
   self.spaces[row][col]
 end
 
 def []=(row, col, space)
   if not space.nil? 
     space.row = row
     space.col = col
   end 
   self.spaces[row][col] = space
 end

DO NOT override methods like that! It's a bug in rails that I hope to have time to report...