【问题标题】:Rails models not being set on create or update创建或更新时未设置 Rails 模型
【发布时间】:2019-12-11 00:32:15
【问题描述】:

我在:

Rails v4.2.11

Ruby v2.4.4

MySQL 5.7

我有以下导轨型号

# app/models/UnsupportedInstitution.rb

class UnsupportedInstitution < ActiveRecord::Base
  attr_accessor :bank_name, :reason

  validates :bank_name, presence: true
  validates :reason, presence: true

  has_many :unsupported_institution_routing_numbers
end

这是模型的迁移:

class CreateUnsupportedInstitutions < ActiveRecord::Migration
  def change
    create_table :unsupported_institutions do |t|
      t.string :bank_name, null: false
      t.string :reason, null: false

      t.timestamps null: false
    end
  end
end

创建以下架构

create_table "unsupported_institutions", force: :cascade do |t|
    t.string   "bank_name",  limit: 255, null: false
    t.string   "reason",     limit: 255, null: false
    t.datetime "created_at",             null: false
    t.datetime "updated_at",             null: false
  end

这似乎都很基本。但是,当我进入 rails 控制台并尝试这样做时:

UnsupportedInstitution.create!(bank_name: 'Hello', reason: 'World'})

我收到以下错误:

INSERT INTO `unsupported_institutions` (`created_at`, `updated_at`) VALUES ('2019-12-11 00:24:22', '2019-12-11 00:24:22')

ActiveRecord::StatementInvalid: Mysql2::Error: Field 'bank_name' doesn't have a default value: INSERT INTO `unsupported_institutions` (`created_at`, `updated_at`) VALUES ('2019-12-11 00:24:22', '2019-12-11 00:24:22')
from /usr/local/bundle/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `_query'

当我尝试使用更新方法以及尝试创建新实例、设置值然后保存模型时,也会发生这种情况。

很明显bank_namereason 属性没有被设置,但我不明白为什么。我怀疑它与迁移中的“null:false”有关,但我无法删除它,因为除了我的 api 之外可能还有其他来源访问这个特定的端点。

谁能解释为什么会发生这种情况和/或我能做些什么来解决这个问题?

【问题讨论】:

  • 从模型中删除attr_accessor :bank_name, :reason
  • @Gerry 成功了。您能否解释为什么attr_accessor 方法阻止了属性的保存?也许在下面的回复中,所以我也可以接受它作为答案。我在attr_accessor 上阅读了文档,但找不到任何保存它的内容会与数据库列冲突
  • Rails 4.x 不再受支持,可能会使您面临严重的安全风险。如果这是一个新项目,或者如果它与实际资金有任何关系,你不应该使用它。同样,Ruby 2.4 即将停产effective March 31, 2020,它很快就会出现。如果可以,请切换到 2.6。这应该是一个简单的升级路径。
  • 谢谢@tadman。我会与我的团队分享这些信息并制定升级计划

标签: mysql ruby-on-rails ruby activerecord


【解决方案1】:

您正在创建访问器方法,这会阻碍对 ActiveRecord 已经为您生成的方法的访问。

你的定义应该是:

class UnsupportedInstitution < ActiveRecord::Base
  validates :bank_name, presence: true
  validates :reason, presence: true

  has_many :unsupported_institution_routing_numbers
end

bank_name 将作为方法自动生成的地方如果数据库中有相应的字段,如果您的迁移成功运行,则该字段存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    相关资源
    最近更新 更多