Rails Gotchas
From Auzigog Wiki
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...
