ruby-on-rails - 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
你有想法吗 ?
祝你今天过得愉快
解决方案
你不需要foreign_key: true
上t.refrences
线。他们将强制进行参照完整性测试。
回滚,然后将迁移更改为...
t.references :deck
t.references :game
或者,您可以只创建整数字段并绕过数据库整数
t.integer :deck_id
t.integer :game_id