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.



239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
# File 'lib/active_record/errors.rb', line 239

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



275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
# File 'lib/active_record/errors.rb', line 275

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