【问题标题】:Rails foreign key optional don't workRails外键可选不起作用
【发布时间】:2018-06-15 12:08:02
【问题描述】:

我的 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-rails ruby-on-rails-3


    【解决方案1】:

    试试这个:

     has_many :game, optional: true
    

    【讨论】:

      【解决方案2】:

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

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

      t.references :deck
      t.references :game
      

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

      t.integer :deck_id
      t.integer :game_id
      

      【讨论】:

      • 编辑了我的答案。回滚迁移,尝试我的答案中的第二个选项,迁移,然后告诉我你的进展情况。
      • 您应该使用 references/belongs_to 帮助器来确保您获得预期的列类型。从 Rails 5.1 开始,主键是 bigint,而不是 int。
      【解决方案3】:

      据我所知,您的实际 Rails 代码没有任何问题;我复制了相关位并在本地运行它,这很好。尽管您在模型中确实有一些拼写错误,但您应该修复(nill 而不是 nil)。我认为这是一个数据库配置问题,特别是考虑到您说它适用于开发但不适用于生产。谷歌搜索您发布的错误消息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 应该可以解决问题。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-07-16
            • 1970-01-01
            • 1970-01-01
            • 2018-01-02
            • 2012-06-05
            • 2016-04-13
            • 1970-01-01
            相关资源
            最近更新 更多