Exception: ActiveRecord::MismatchedForeignKey

Inherits:
StatementInvalid show all
Defined in:
lib/active_record/errors.rb

Overview

Raised when a foreign key constraint cannot be added because the column type does not match the referenced column type.

Instance Attribute Summary

Attributes inherited from StatementInvalid

#binds, #sql

Attributes inherited from AdapterError

#connection_pool

Instance Method Summary collapse

Constructor Details

#initialize(message: nil, sql: nil, binds: nil, table: nil, foreign_key: nil, target_table: nil, primary_key: nil, primary_key_column: nil, query_parser: nil, connection_pool: nil) ⇒ MismatchedForeignKey

Returns a new instance of MismatchedForeignKey.



226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
# File 'lib/active_record/errors.rb', line 226

def initialize(
  message: nil,
  sql: nil,
  binds: nil,
  table: nil,
  foreign_key: nil,
  target_table: nil,
  primary_key: nil,
  primary_key_column: nil,
  query_parser: nil,
  connection_pool: nil
)
  @original_message = message
  @query_parser = query_parser

  if table
    type = primary_key_column.bigint? ? :bigint : primary_key_column.type
    msg = <<~EOM.squish
      Column `#{foreign_key}` on table `#{table}` does not match column `#{primary_key}` on `#{target_table}`,
      which has type `#{primary_key_column.sql_type}`.
      To resolve this issue, change the type of the `#{foreign_key}` column on `#{table}` to be :#{type}.
      (For example `t.#{type} :#{foreign_key}`).
    EOM
  else
    msg = <<~EOM.squish
      There is a mismatch between the foreign key and primary key column types.
      Verify that the foreign key column type and the primary key of the associated table match types.
    EOM
  end
  if message
    msg << "\nOriginal message: #{message}"
  end

  super(msg, sql: sql, binds: binds, connection_pool: connection_pool)
end

Instance Method Details

#set_query(sql, binds) ⇒ Object



262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
# File 'lib/active_record/errors.rb', line 262

def set_query(sql, binds)
  if @query_parser && !@sql
    self.class.new(
      message: @original_message,
      sql: sql,
      binds: binds,
      connection_pool: @connection_pool,
      **@query_parser.call(sql)
    ).tap do |exception|
      exception.set_backtrace backtrace
    end
  else
    super
  end
end