Julien Lamarche
Julien Lamarche

Reputation: 1050

ActiveRecord::Fixture::FixtureError: table has no columns named "false"

I am getting the error: ActiveRecord::Fixture::FixtureError: table "creatures" has no columns named "false". I have no column named false in this model.

What is going on?

Here is my fixture:

  3 one:
  4   name: MyString
  5   no: 1
  6   type1: 1
  7   type2: 1
  8   total: 1
  9   hp: 1
 10   attack: 1
 11   defense: 1
 12   special_attack: 1
 13   special_defense: 1
 14   speed: 1
 15   generation: 1
 16   legendary: false
 17

Upvotes: 1

Views: 194

Answers (2)

Adding the solution to my problem with the same symptom:

I also saw these table parent has no column named child errors on my has_one and has_many associations. To fix them, I had to remove the association from the parent fixture and add it only to the child fixture. So for a "Parent has many Children" association:

# parents.yml

parent_one:
  name: Parent1
# children.yml

child_one:
  name: Child1
  parent: parent_one

child_two:
  name: Child2
  parent: parent_one

Upvotes: 0

Julien Lamarche
Julien Lamarche

Reputation: 1050

Putting the no in single quotes solved the problem.

If I put a debugger call just before the error is raised:

[475, 484] in /usr/local/bundle/gems/activerecord-7.0.4.2/lib/active_record/connection_adapters/abstract/database_statements.rb
   475:             fixture = fixture.stringify_keys
   476: 
   477:             unknown_columns = fixture.keys - columns.keys
   478:             if unknown_columns.any?
   479:               debugger
=> 480:               raise Fixture::FixtureError, %(table "#{table_name}" has no columns named #{unknown_columns.map(&:inspect).join(', ')}.)
   481:             end
   482: 
   483:             columns.map do |name, column|
   484:               if fixture.key?(name)
(byebug) fixtures

It looks like the no got interpreted as a false:

[{"name"=>"MyString", false=>1, "type1"=>1, "type2"=>1, "total"=>1, "hp"=>1, "attack"=>1, "defense"=>1, "special_attack"=>1, "special_defense"=>1, "speed"=>1, "genneration"=>1, "legendary"=>false, "created_at"=>2023-02-05 18:53:31.63881045 UTC, "updated_at"=>2023-02-05 18:53:31.63881045 UTC, "id"=>980190962}, {"name"=>"MyString", false=>2, "type1"=>1, "type2"=>1, "total"=>1, "hp"=>1, "attack"=>1, "defense"=>1, "special_attack"=>1, "special_defense"=>1, "speed"=>1, "genneration"=>1, "legendary"=>false, "created_at"=>2023-02-05 18:53:31.63881045 UTC, "updated_at"=>2023-02-05 18:53:31.63881045 UTC, "id"=>298486374}]

Putting the no in single quotes solved the problem:

  3 one:
  4   name: MyString
  5   'no': 1
  6   type1: 1
  7   type2: 1
  8   total: 1
  9   hp: 1
 10   attack: 1
 11   defense: 1
 12   special_attack: 1
 13   special_defense: 1
 14   speed: 1
 15   generation: 1
 16   legendary: false
 17 
 18 two:
 19   name: MyString
 20   'no': 2
 21   type1: 1
 22   type2: 1
 23   total: 1
 24   hp: 1
 25   attack: 1
 26   defense: 1
 27   special_attack: 1
 28   special_defense: 1
 29   speed: 1
 30   generation: 1
 31   legendary: false

Upvotes: 2

Related Questions