在Rails中添加一个数组列

你如何在Rails中声明一个数组列?

详情

我有以下型号

rails generate model User address:text 

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

 rails generate model User address[]:text 

你如何在Rails中声明一个数组列?

您可以使用以下步骤

 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 => # 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 

如果您使用的是Postgres,则此posthttp://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,这个答案可能会有所帮助: 在数据库中存储数组:JSON与序列化数组

使用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"] 

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