首页 > 解决方案 > Rails外键可选不起作用

问题描述

我在使用模型的 Rails API 中遇到了问题,我的 play_cards 模型有一些外来键,但是我遇到了问题,因为我得到了Mysql2::Error: Field 'deck_id' doesn't have a default value,但我不需要我的套牌和游戏是强制性的。

PS:它在开发中有效,但在生产中无效

这是我的模型:

class PlayCard < ApplicationRecord

# @!group RELATIONS
belongs_to :card
belongs_to :deck, optional: true
belongs_to :game, optional: true
belongs_to :user
# @!endgroup

# @!group VALIDATORS
validates :card_id, presence: true, blank: false, nill: false
validates :user_id, presence: true, blank: false, nill: false
validates :atk, presence: true, blank: false, nill: false, numericality: { greater_than_or_equal_to: 0 }
validates :hp, presence: true, blank: false, nill: false, numericality: { greater_than: 0 }
validates :uid, presence: true, allow_blank: false, allow_nil: false, length: { is: 4 }, uniqueness: true
# @!endgroup
end

这是我的迁移:

class CreatePlayCards < ActiveRecord::Migration[5.2]
def change
create_table :play_cards do |t|
  t.references :card, foreign_key: true, null: false
  t.integer :atk, null: false
  t.integer :hp, null: false
  t.references :deck, foreign_key: true
  t.references :game, foreign_key: true
  t.string :uid, limit: 4, null: false

  t.timestamps
end
end
end

你有想法吗 ?

祝你今天过得愉快

标签: ruby-on-railsruby-on-rails-3

解决方案


你不需要foreign_key: truet.refrences线。他们将强制进行参照完整性测试。

回滚,然后将迁移更改为...

t.references :deck
t.references :game

或者,您可以只创建整数字段并绕过数据库整数

t.integer :deck_id
t.integer :game_id

推荐阅读