Rails 3 => 当我尝试 rake db:migrate 时未定义的方法'array'

Posted

技术标签:

【中文标题】Rails 3 => 当我尝试 rake db:migrate 时未定义的方法\'array\'【英文标题】:Rails 3 => Undefined method 'array' when I try to rake db:migrateRails 3 => 当我尝试 rake db:migrate 时未定义的方法'array' 【发布时间】:2012-06-30 13:16:30 【问题描述】:

这是我在这里的第一篇文章,所以请放轻松。我正在尝试在 Rails 3.2.1 中构建我的第一个应用程序。我正在尝试使用以下终端命令为 Paint 生成一个脚手架:

rails generate scaffold Paint paint_family:string paint_hex:array paint_available:boolean     paint_location:integer paint_quantity:integer paint_additional_info:text

但是当我尝试迁移时,出现以下错误:

undefined method `array' for #<ActiveRecord::ConnectionAdapters::TableDefinition:0x007fbd8bdb1c58>

迁移记录如下:

  class CreatePaints < ActiveRecord::Migration
  def change
    create_table :paints do |t|
    t.string :paint_family
    t.array :paint_hex
    t.boolean :paint_available
    t.integer :paint_location
    t.integer :paint_quantity
    t.text :paint_additional_info

    t.timestamps
 end
 end

结束

我终其一生都无法弄清楚这是为什么。但那是因为我不知道我在做什么。任何建议/帮助将不胜感激。

【问题讨论】:

【参考方案1】:

问题是这样的:

t.array :paint_hex

没有名为array 的列类型。如果你真的想保存一个数组,你可以使用stringtext 然后序列化这个值。

class Paint < ActiveRecord::Base
  serialize :paint_hex
end

顺便说一句:在所有属性名称前加上 paint_ 是一种非常不常见的 Rails 应用程序命名方案。

【讨论】:

然后给我一个upvote并选择我的答案作为正确的答案。这就是我们对***表示赞赏的方式......【参考方案2】:

在 Rails 4 和使用 PostgreSQL 中,您实际上可以在 DB 中使用数组类型:

迁移:

class CreateSomething < ActiveRecord::Migration
  def change
    create_table :something do |t|
      t.string :some_array, array: true, default: []
      t.timestamps
    end
  end
end

【讨论】:

【参考方案3】:

数组不是有效的数据库类型。您不能创建类型为数组的列。

有一些方法可以将数组存储在字段中。检查serialize 方法。 您必须声明 text 类型的列,并且在类中指定列序列化为数组类型的对象

【讨论】:

以上是关于Rails 3 => 当我尝试 rake db:migrate 时未定义的方法'array'的主要内容,如果未能解决你的问题,请参考以下文章

Rails 4 - AwesomeEotPath 之后 Rake 中止,无效的 CSS

尝试 rake db:migrate 时未在 rails 项目中选择数据库

在 rake 任务中使用 rails logger,rails 5

Rails 3.1.1 资产预编译 - rake 中止

rake 规范不使用 rails 环境

Heroku 推送错误:“无法检测到 rake 任务”(Rails 6.1)