【问题标题】:Can't access uuid field in rails migration无法在 Rails 迁移中访问 uuid 字段
【发布时间】:2015-09-07 15:13:48
【问题描述】:

我有一个名为“products”的表(模型是 Product),在迁移上下文中运行时我无法访问 :uuid 属性。迁移本身不会改变结构,但会访问并创建新对象来填充数据库。

这是迁移前 schema.rb 的 sn-p:

  create_table "products", force: :cascade do |t|
    t.string   "title"
    t.string   "description"
    t.string   "price"
    t.uuid     "uuid"
  end

Product对象定义如下:

  class Product < ActiveRecord::Base
  end

现在在 Rails 控制台/代码中运行时可以正常工作:

p = Product.create!(:uuid => xxx)
puts p.uuid # => xxx
puts p.inspect # => Product(title: string, description: string, price: string, uuid: uuid)

但是在迁移上下文中运行时 - 相同的代码会引发异常:

p = Product.create!(:uuid => xxx)
puts p.uuid # => undefined method `uuid' for <Product:0x007fea6d7aa058>/opt/rubies/2.2.0/lib/ruby/gems/2.2.0/gems/activemodel-4.2.3/lib/active_model/attribute_methods.rb:433
puts p.inspect # => Product(title: string, description: string, price: string)

缺少 uuid 属性!怎么了?

【问题讨论】:

  • 您能发布整个迁移文件吗?
  • 你在使用PostgreSQL &gt;= 9.4吗?
  • @BroiStatse 嗯.. 我会这样做,但不幸的是它包含太多私有代码
  • @pavan 是的,事实上我们使用的是 Postgres 9.4

标签: ruby-on-rails ruby ruby-on-rails-4 migration rails-migrations


【解决方案1】:

Product.reset_column_information

在您的Product.create 行之前。

【讨论】:

  • 你得到了第一个的“正确答案”!关闭电话:)
【解决方案2】:

模型的架构一般会在迁移后刷新。因此,即使创建了uuid 字段,模型也不知道它。

您可以使用强制刷新

Product.reset_column_information

但是,您的代码中的问题表明您可能正在使用迁移功能在迁移本身内部创建记录。通常不建议这样做,因为迁移旨在更改数据库的架构,而不是数据。

您应该使用创建特定的 rake 任务来修改数据并在迁移完成后运行该任务,例如从控制台。

【讨论】:

  • 我们确实使用这些迁移来填充默认配置等。我知道这在技术上不是数据库结构的一部分,但它非常方便......
  • 不管怎样,你的计划听起来很有趣,我可能会学到一些新的东西......所以(1)你如何在 CI 系统中自动做到这一点? (2) 在模型代码更改的未来版本中,您如何防止此代码中断?我们目前通过在迁移中设置临时类以匹配数据库的当前状态来解决这两个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多