Rails外键可选不起作用

时间:2018-06-15 12:08:02

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

我在使用模型的rails API中遇到了麻烦,我的plays_cards模型有一些foreigns键,但有一个我有麻烦,因为我得到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

你有什么想法吗?

度过愉快的一天

5 个答案:

答案 0 :(得分:2)

foreign_key: true行不需要t.refrences。他们会强制进行参照完整性测试。

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

t.references :deck
t.references :game

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

t.integer :deck_id
t.integer :game_id

答案 1 :(得分:1)

据我所知,您的实际Rails代码没有任何问题;我复制了相关的位并在本地运行它很好。虽然你在模型中确实有一些拼写错误,你应该修复(nill而不是nil)。我认为这是一个数据库配置问题,特别是考虑到你说它适用于开发但不适用于生产。通过Google搜索您发布的Mysql2::Error: Field 'deck_id' doesn't have a default value错误消息,可以得到this等结果。根据其中一个答案:

  

这是由%PROGRAMDATA%\MySQL\MySQL Server 5.6\my.ini文件中定义的STRICT_TRANS_TABLES SQL模式引起的。删除该设置并重新启动MySQL应该可以解决问题。

答案 2 :(得分:1)

您好我通过删除我的数据库来解决它并重新创建它......

答案 3 :(得分:0)

试试这个:

 has_many :game, optional: true

答案 4 :(得分:0)

在rails 3上,只需像这样更改列的属性

change_column :table, :column, :integer, null: true