在Rails中添加一个数组列

时间:2015-09-05 05:29:31

标签: ruby-on-rails

如何在Rails中声明数组列?

详细

我有以下型号

rails generate model User address:text

但我想要一个可以为每个用户存储多个地址的模型。以下声明给我一个错误

rails generate model User address[]:text 

如何在Rails中声明数组列?

4 个答案:

答案 0 :(得分:34)

您可以使用以下步骤

rails g migration add_subjects_to_book subjects:text

迁移文件:

class AddSubjectsToBook < ActiveRecord::Migration
  def change
    add_column :books, :subjects, :text, array: true, default: []
  end
end

我们现在可以查看:

2.1.2 :001 > b = Book.create
   (0.2ms)  BEGIN
  SQL (2.0ms)  INSERT INTO "books" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", "2014-10-17 08:21:17.870437"], ["updated_at", "2014-10-17 08:21:17.870437"]]
   (0.5ms)  COMMIT
 => #<Book id: "39abef75-56af-4ad5-8065-6b4d58729ee0", title: nil, created_at: "2014-10-17 08:21:17", updated_at: "2014-10-17 08:21:17", description: {}, metadata: {}, subjects: []>

2.1.2 :002 > b.subjects.class
 => Array

如果要在创建表时添加数组,可按以下步骤操作

create_table :products do |t|
  t.string :name, null: false
  t.references :category, null: false
  t.text :tags, array: true, default: []
end

答案 1 :(得分:17)

如果您使用的是Postgres,则此帖http://blog.plataformatec.com.br/2014/07/rails-4-and-postgresql-arrays/建议在迁移脚本中使用array: true选项:

create_table :users do |t|
  # other columns
  t.text : addresses, array: true, default: []
end

如果您不使用Postgres,这个答案可能会有所帮助:Storing arrays in database : JSON vs. serialized array

答案 2 :(得分:13)

使用array: true的示例需要Postgres或其他一些数组类型的数据库。对于MySQL,使用通用序列化,它允许您在列中存储任意类型。

数据库迁移:

create_table :users do |t|
  t.text :addresses, default: [].to_yaml
  ...
end

具有数组属性的类:

class User < ActiveRecord::Migration
  serialize :addresses, Array
end

使用属性:

u = User.new
u.update_attributes addresses: ["123 Evergreen", "246 Main"]

通常的警告适用于在数据库中存储数组。它违背了关系数据库的要求,并且会使搜索单个项目变得困难,缓慢或不可能。但是,在您需要执行这些操作之前,它可以是基本存储的精细解决方案。

答案 3 :(得分:1)

如果使用Rails 5,请按照以下步骤在用户表中添加地址数组:

运行以下命令以生成带有表的模型,

rails generate model User address:text

该表将创建类似于以下内容的创建表:

class CreateUser < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.text :address
      t.timestamps
    end
  end
end

现在在用户模型中为地址添加序列化

class User < ApplicationRecord
 serialize :address, Array
end

谢谢。