无法在rails迁移中访问uuid字段

时间:2015-09-07 15:13:49

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

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

这是迁移前schema.rb的片段:

  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 console / code中运行时,这很好用:

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属性!怎么了?

2 个答案:

答案 0 :(得分:1)

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

您可以使用

强制刷新
Product.reset_column_information

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

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

答案 1 :(得分:1)

Product.reset_column_information
Product.create行之前