Markus Goedeke
2009-Nov-04  06:14 UTC
The error occurred while evaluating nil.prefetch_primary_key
The error occurred while evaluating nil.prefetch_primary_key?
Hi,
I have a problem with a model when I have 3 belongs_to relations in one
the middle.
This example is a subset of a grid-routing project:
                         n          1
           1     n      +------------ Project
Connection ------- ConnectionCost
                        +------------ WaySearchRun
                         n          1
The Problem is, when I add the ''belongs_to'' in ConnectionCost.
I get the following error-message after creating a ConnectionCost :
>> ConnectionCost.create
NoMethodError: You have a nil object when you didn''t expect it!
The error occurred while evaluating nil.prefetch_primary_key?
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/base.rb:2721:in
`create_without_callbacks''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/callbacks.rb:237:in
`create_without_timestamps''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/timestamp.rb:29:in
`create''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/base.rb:2701:in
`create_or_update_without_callbacks''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/callbacks.rb:222:in
`create_or_update''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/base.rb:2385:in
`save_without_validation''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/validations.rb:1009:in
`save_without_dirty''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/dirty.rb:79:in
`save_without_transactions''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/transactions.rb:179:in
`send''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/transactions.rb:179:in
`with_transaction_returning_status''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/database_statements.rb:66:in
`transaction''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/transactions.rb:129:in
`transaction''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/transactions.rb:178:in
`with_transaction_returning_status''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/transactions.rb:146:in
`save''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/transactions.rb:158:in
`rollback_active_record_state!''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/transactions.rb:146:in
`save''
  from
/home/markus/Development/GPT2/my_test2/vendor/rails/activerecord/lib/active_record/base.rb:693:in
`create''
  from (irb):5>>
For this test I created a new rails-project (version 2.2.3).
Models :
class Connection < ActiveRecord::Base
  has_many   :connection_costs
end
class Project < ActiveRecord::Base
  has_many                :connection_costs
end
class WaySearchRun < ActiveRecord::Base
  has_many                :connection_costs
end
class ConnectionCost < ActiveRecord::Base
    belongs_to :connection     # dosn''t WORK !!!!
    belongs_to :project
    belongs_to :way_search_run
end
Migrations :
class CreateConnections < ActiveRecord::Migration
  def self.up
    create_table :connections do |t|
      t.string     :name                               # Name
      t.string     :alias                              # Alias-Name
      t.string     :descr                              # Description
      t.timestamps
    end
  end
  def self.down
    drop_table :connections
  end
end
class CreateProjects < ActiveRecord::Migration
  def self.up
    create_table :projects do |t|
      t.string     :name                         # Name
      t.string     :descr                        # Description
      t.timestamps
    end
  end
  def self.down
    drop_table :projects
  end
end
class CreateWaySearchRuns < ActiveRecord::Migration
  def self.up
    create_table :way_search_runs do |t|
      t.string     :name                         # Name
      t.string     :descr                        # Description
      t.integer    :sort_number                  # for sorting - for a
project in 10-steps
      t.references :project                      # Link to an
''Project''
      t.timestamps
    end
    add_index :way_search_runs, :project_id
  end
  def self.down
    drop_table :way_search_runs
  end
end
class CreateConnectionCosts < ActiveRecord::Migration
  def self.up
    create_table :connection_costs do |t|
      t.decimal    :cost        ,:precision=>10,:scale=>4
,:default=>100.0 # absolute Costs
      t.decimal    :cost_factor ,:precision=>10,:scale=>4
,:default=>1.0
# CostFactor -> totalCosts = CostFactor * absCosts
      t.references :connection
# Link to an ''Connection''
      t.references :project
# Link to an ''Project''
      t.references :way_search_run
# Link to an ''WaySearchRun''
      t.timestamps
    end
    add_index :connection_costs, :connection_id
    add_index :connection_costs, :project_id
    add_index :connection_costs, :way_search_run_id
  end
  def self.down
    drop_table :connection_costs
  end
end
Thanks!
-- 
Posted via http://www.ruby-forum.com/.
