为啥 Active Record 发送的数据与 schema.rb 不同?

Posted

技术标签:

【中文标题】为啥 Active Record 发送的数据与 schema.rb 不同?【英文标题】: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 数据库,如果您看到该列,请告诉我们 【参考方案1】:

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

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

  def self.down
    remove_column :advance_payments, :transferred
  end

【讨论】:

以上是关于为啥 Active Record 发送的数据与 schema.rb 不同?的主要内容,如果未能解决你的问题,请参考以下文章

MVC vs. Active Record vs. Factory [关闭]

Codeigniter Active Record 中的 Concat

CodeIgniter Active Record 与常规查询

Active Record Query Interface 数据查询接口(界面)

Rails Active Record连接查询与排序和限制

Codeigniter Active Record - 计算找到的总行数(MySQL)