Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Can';rails迁移中的t访问uuid字段_Ruby On Rails_Ruby_Ruby On Rails 4_Migration_Rails Migrations - Fatal编程技术网

Ruby on rails Can';rails迁移中的t访问uuid字段

Ruby on rails Can';rails迁移中的t访问uuid字段,ruby-on-rails,ruby,ruby-on-rails-4,migration,rails-migrations,Ruby On Rails,Ruby,Ruby On Rails 4,Migration,Rails Migrations,我有一个名为“products”(模型是Product)的表,在迁移上下文中运行时无法访问:uuid属性。迁移本身不会改变结构,而是访问并创建新对象来填充数据库 这是迁移之前schema.rb的一个片段: create_table "products", force: :cascade do |t| t.string "title" t.string "description" t.string "price" t.uuid "uuid"

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

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

  create_table "products", force: :cascade do |t|
    t.string   "title"
    t.string   "description"
    t.string   "price"
    t.uuid     "uuid"
  end
产品对象定义如下:

  class Product < ActiveRecord::Base
  end
但是,在迁移上下文中运行时,同一代码会引发异常:

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)
p=Product.create!(:uuid=>xxx)
将p.uuid#=>未定义的方法“uuid”用于/opt/rubies/2.2.0/lib/ruby/gems/2.2.0/gems/activemodel-4.2.3/lib/active\u model/attribute\u方法。rb:433
放置p.inspect#=>产品(标题:字符串,描述:字符串,价格:字符串)

缺少uuid属性!怎么了?

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

您可以使用强制刷新

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

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

put

Product.reset_column_information

在您的
产品之前。创建
行。

您可以发布整个迁移文件吗?您使用的是
PostgreSQL>=9.4
?@broisteze-Hmm。。我会这么做,但不幸的是它包含了太多的隐私code@pavan是的,事实上我们使用的是Postgres 9.4,我们确实使用这些迁移来填充默认配置等。我知道这在技术上不是DB结构的一部分,但它非常方便……不管怎样,你的计划听起来很有趣,我可能会学到一些新东西。。。那么(1)如何在CI系统中自动实现这一点?(2)在模型代码发生变化的未来版本中,如何防止这些代码被破坏?目前,我们通过在迁移中设置临时类来解决这两个问题,以匹配数据库的当前状态。作为第一个,您得到了“正确答案”!结束通话:)
Product.reset_column_information