Rails 6.1 migration. add_reference got wrong number of arguments (given 3, expected 2)

155 views Asked by At

This is the weirdest thing...

I did this in my migration

class AddImmuneVaccineToImmuneRecord < ActiveRecord::Migration[6.1]
  def change
    add_reference :immunisation_records, :immune_vaccine
  end
end

And got ArgumentError: wrong number of arguments (given 3, expected 2)

But when I did

class AddImmuneVaccineToImmuneRecord < ActiveRecord::Migration[6.1]
  def change
    add_column :immunisation_records, :immune_vaccine_id, :bigint
    add_index :immunisation_records, :immune_vaccine_id
  end
end

it worked. Where did the 3rd argument come from??

Edit

Below are the console output

rake db:migrate --trace
** Invoke db:migrate (first_time)
** Invoke db:load_config (first_time)
** Invoke environment (first_time)
** Execute environment
warning package.json: No license field                                                                                                                                                                                                                                                                                                                                                                               
warning No license field                                                                                                                                                                                                                                                                                                                                                                                             
** Execute db:load_config
** Execute db:migrate
== 20230908020630 AddImmuneVaccineToImmuneRecord: migrating ===================
-- add_reference(:immunisation_records, :immune_vaccine, {:foreign_key=>true})
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

wrong number of arguments (given 3, expected 2)
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/connection_adapters/abstract/schema_statements.rb:972:in `add_reference'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-native_db_types_override-0.3.0/lib/activerecord-native_db_types_override/patches.rb:12:in `add_reference'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:929:in `block in method_missing'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:897:in `block in say_with_time'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/3.0.0/benchmark.rb:293:in `measure'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:897:in `say_with_time'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:918:in `method_missing'
/Users/williamhu/Develop/Ruby/endia/db/migrate/20230908020630_add_immune_vaccine_to_immune_record.rb:3:in `change'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:867:in `exec_migration'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:851:in `block (2 levels) in migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/3.0.0/benchmark.rb:293:in `measure'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:850:in `block in migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:462:in `with_connection'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:849:in `migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1037:in `migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1329:in `block in execute_migration_in_transaction'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1382:in `ddl_transaction'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1328:in `execute_migration_in_transaction'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1302:in `each'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1302:in `migrate_without_lock'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1251:in `block in migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1401:in `block in with_advisory_lock'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1416:in `block in with_advisory_lock_connection'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:462:in `with_connection'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1416:in `with_advisory_lock_connection'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1397:in `with_advisory_lock'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1251:in `migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1086:in `up'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1061:in `migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:237:in `migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/railties/databases.rake:92:in `block (3 levels) in <main>'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/railties/databases.rake:90:in `each'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/railties/databases.rake:90:in `block (2 levels) in <main>'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `block in execute'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `each'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `execute'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `synchronize'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `invoke_with_call_chain'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:188:in `invoke'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:160:in `invoke_task'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `each'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block in top_level'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:125:in `run_with_threads'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:110:in `top_level'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:83:in `block in run'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:80:in `run'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/Users/williamhu/.rbenv/versions/3.0.5/bin/rake:25:in `load'
/Users/williamhu/.rbenv/versions/3.0.5/bin/rake:25:in `<main>'

Caused by:
ArgumentError: wrong number of arguments (given 3, expected 2)
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/connection_adapters/abstract/schema_statements.rb:972:in `add_reference'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-native_db_types_override-0.3.0/lib/activerecord-native_db_types_override/patches.rb:12:in `add_reference'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:929:in `block in method_missing'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:897:in `block in say_with_time'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/3.0.0/benchmark.rb:293:in `measure'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:897:in `say_with_time'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:918:in `method_missing'
/Users/williamhu/Develop/Ruby/endia/db/migrate/20230908020630_add_immune_vaccine_to_immune_record.rb:3:in `change'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:867:in `exec_migration'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:851:in `block (2 levels) in migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/3.0.0/benchmark.rb:293:in `measure'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:850:in `block in migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:462:in `with_connection'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:849:in `migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1037:in `migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1329:in `block in execute_migration_in_transaction'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1382:in `ddl_transaction'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1328:in `execute_migration_in_transaction'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1302:in `each'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1302:in `migrate_without_lock'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1251:in `block in migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1401:in `block in with_advisory_lock'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1416:in `block in with_advisory_lock_connection'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:462:in `with_connection'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1416:in `with_advisory_lock_connection'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1397:in `with_advisory_lock'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1251:in `migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1086:in `up'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/migration.rb:1061:in `migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/tasks/database_tasks.rb:237:in `migrate'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/railties/databases.rake:92:in `block (3 levels) in <main>'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/railties/databases.rake:90:in `each'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/activerecord-6.1.7.2/lib/active_record/railties/databases.rake:90:in `block (2 levels) in <main>'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `block in execute'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `each'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:281:in `execute'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:219:in `block in invoke_with_call_chain'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `synchronize'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:199:in `invoke_with_call_chain'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/task.rb:188:in `invoke'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:160:in `invoke_task'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `each'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:116:in `block in top_level'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:125:in `run_with_threads'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:110:in `top_level'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:83:in `block in run'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:186:in `standard_exception_handling'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/lib/rake/application.rb:80:in `run'
/Users/williamhu/.rbenv/versions/3.0.5/lib/ruby/gems/3.0.0/gems/rake-13.0.6/exe/rake:27:in `<top (required)>'
/Users/williamhu/.rbenv/versions/3.0.5/bin/rake:25:in `load'
/Users/williamhu/.rbenv/versions/3.0.5/bin/rake:25:in `<main>'
Tasks: TOP => db:migrate

And tried without foreign key. Same error.

1

There are 1 answers

3
Milind On

The error is correct...

Correct way to use add_reference -

Create a user_id bigint column without an index
add_reference(:products, :user, index: false)

Create a user_id string column
add_reference(:products, :user, type: :string)

Create supplier_id, supplier_type columns
add_reference(:products, :supplier, polymorphic: true)

Create a supplier_id column with a unique index
add_reference(:products, :supplier, index: { unique: true })

Create a supplier_id column with a named index
add_reference(:products, :supplier, index: { name: "my_supplier_index" })

Create a supplier_id column and appropriate foreign key
add_reference(:products, :supplier, foreign_key: true)

Create a supplier_id column and a foreign key to the firms table
add_reference(:products, :supplier, foreign_key: { to_table: :firms })

Reference https://api.rubyonrails.org/v7.0.7.2/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_reference