首页 > 解决方案 > 为什么 Active Record 发送的数据与 schema.rb 不同?

问题描述

我创建了一个新的迁移来添加一个名为tabletransferred的列advance_payments

class AddTransferredToAdvancePayments < ActiveRecord::Migration[5.0]
  def change
    add_column :advance_payments, :transferred , :boolean, default: false
  end
end

迁移后,该列确实存在于schema.rb中:

  create_table "advance_payments", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
   ...
    t.boolean  "transferred",                                    default: false
   ...
  end

安慰

但是当我AdvancePayment在控制台中检查一个对象时,没有名为transferred

AdvancePayment.last.transferred或者AdvancePayment.last.transferred?

NoMethodError:未定义的方法“已转移”

[1] pry(main)> AdvancePayment.last
  AdvancePayment Load (0.5ms)  SELECT  `advance_payments`.* FROM `advance_payments` ORDER BY `advance_payments`.`id` DESC LIMIT 1
=> #<AdvancePayment:0x0000000747e468
 id: 107,
 ...
 // all columns except "transferred"



[10] pry(main)> AdvancePayment.has_attribute?(:transferred)
=> false

我尝试了db:migrate并且db:schema:load得到了相同的结果。我还尝试drop重新创建数据库,关闭然后重新打开服务器没什么更好的。

标签: ruby-on-railsactiverecordschema

解决方案


无法真正解释原因,但编辑change方法updown解决了问题

  def self.up
    add_column :advance_payments, :transferred , :boolean, default: false
  end

  def self.down
    remove_column :advance_payments, :transferred
  end

推荐阅读