你如何在Rails中声明一个数组列?
详情
我有以下型号
rails generate model User address:text
Run Code Online (Sandbox Code Playgroud)
但我想要一个可以为每个用户存储多个地址的模型.以下声明给我一个错误
rails generate model User address[]:text
Run Code Online (Sandbox Code Playgroud)
你如何在Rails中声明一个数组列?
sk1*_*712 39
您可以使用以下步骤
rails g migration add_subjects_to_book subjects:text
Run Code Online (Sandbox Code Playgroud)
和迁移文件:
class AddSubjectsToBook < ActiveRecord::Migration
def change
add_column :books, :subjects, :text, array: true, default: []
end
end
Run Code Online (Sandbox Code Playgroud)
我们现在可以查看:
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
Run Code Online (Sandbox Code Playgroud)
如果要在创建表时添加数组,可以执行以下操作
create_table :products do |t|
t.string :name, null: false
t.references :category, null: false
t.text :tags, array: true, default: []
end
Run Code Online (Sandbox Code Playgroud)
dim*_*ura 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
Run Code Online (Sandbox Code Playgroud)
如果您不使用Postgres,这个答案可能会有所帮助:在数据库中存储数组:JSON与序列化数组
mah*_*off 14
使用的例子 array: true需要Postgres或其他一些能够使用数组类型的数据库.对于MySQL,使用通用序列化,它允许您在列中存储任意类型.
create_table :users do |t|
t.text :addresses, default: [].to_yaml
...
end
Run Code Online (Sandbox Code Playgroud)
通常的警告适用于将数组存储在数据库中.这样做违背了关系数据库的范畴,并且会使搜索单个项目变得困难,缓慢或不可能.但是,在您需要执行这些操作之前,它可以是基本存储的精细解决方案.
| 归档时间: |
|
| 查看次数: |
31131 次 |
| 最近记录: |