2015-09-05 8 views
10

Railsで配列列をどのように宣言しますか?Railsで配列列を追加

詳細

私は、次のモデル

rails generate model User address:text 

を持っていますが、私は、ユーザーごとに複数のアドレスを格納できるモデルをしたいです。次の宣言でエラーが返される

rails generate model User address[]:text 

どのようにして配列列をRailsに宣言しますか?

+0

[データベース内の配列の格納:JSONとシリアル化された配列](http://stackoverflow.com/questions/21312278/storing-arrays-in-database-json-vs-serialized-array) –

+0

おそらくhttp://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many ... –

答えて

9

あなたはPostgresのを使用している場合は、この記事http://blog.plataformatec.com.br/2014/07/rails-4-and-postgresql-arrays/は、移行スクリプトでarray: trueオプションを使用することを提案している:あなたはPostgresのを使用していない場合は

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

エンド

、この答えは役に立つかもしれません:Storing arrays in database : JSON vs. serialized array

11

次の手順を使用できます。

rails g migration add_subjects_to_book subjects:text 
0123我々は今、それを確認することができます

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 
7

例を次のようにあなたが行うことができます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"] 

通常の注意点は、データベースに配列を格納する場合に適用されます。これを行うためにリレーショナルデータベースのグレインに反して、個々のアイテムを検索するようなことをするのは難しく、遅く、不可能になります。しかし、あなたがそれらのことをする必要があるまで基本的なストレージのための良い解決策になることができます。