【问题标题】:Why Active Record doesn't send same data than schema.rb?为什么 Active Record 发送的数据与 schema.rb 不同?
【发布时间】:2018-12-10 12:23:15
【问题描述】:

我创建了一个新的迁移,将名为transferred 的列添加到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.transferredAdvancePayment.last.transferred?

NoMethodError: 未定义的方法 `transferred'

[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:migratedb:schema:load 得到相同的结果。 我还尝试drop,而不是重新创建数据库,关闭然后重新打开服务器,没什么更好的。

【问题讨论】:

  • transferred?transfrerred= 怎么样 - 这些存在吗?
  • 退出控制台并重新进入。
  • @JagdeepSingh 我编辑了我的帖子。不起作用:/
  • @meta 也不起作用
  • 检查您的 INNODB 数据库,如果您看到该列,请告诉我们

标签: ruby-on-rails activerecord schema


【解决方案1】:

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

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

  def self.down
    remove_column :advance_payments, :transferred
  end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多