web-dev-qa-db-ja.com

Rails:マイグレーションを追加して配列を追加(デフォルトは空)

リソースの1つにshareという列を追加しようとしています。アイデアは、ユーザーがドキュメントをアップロードして他の(特定の)ユーザーと共有でき、配列にはユーザーが共有したいメールが含まれているということです。

コードで移行を追加してみました

class AddShareToDocuments < ActiveRecord::Migration
  def change
    add_column :documents, :share, :array, :default => []
  end
end

しかし、コマンドプロンプトでRails consoleを開くと、share:nilとuser.document.share.classはNilClassであると表示されます。

入力してRailsコンソールサンドボックスに新しい配列を作成する

newarray = []

newarray.classは配列であると言います。

誰かが私が間違っていることを見つけることができますか?

23
user2669464

すべてのデータベースをサポートする場合は、文字列で配列をシリアル化する必要があります

class Documents < ActiveRecord::Base
 serialize :share
end

class AddShareToDocuments < ActiveRecord::Migration
 def change
   add_column :documents, :share, :string, :default => []
 end 
end

Postgresqlと配列データ型の場合、私は見つけました https://coderwall.com/p/sud9ja

6
michelemina

通常、配列はデータベースに格納されるタイプではありません。 micheleminaが指摘しているように、配列内のデータのタイプが単純な場合(strings、intなど)、それらを文字列にシリアル化して保存できます。メールの場合は、これを行うことができます。

一方、ドキュメントが共有されたすべてのユーザーオブジェクトを検索できるようにしたい場合は、これを行うより良い方法があります。 「結合テーブル」が必要になります。あなたの場合、結合テーブルオブジェクトは共有と呼ばれ、以下の属性を持ちます:

class Share
  belongs_to :user
  belongs_to :document
end

次に、Documentクラスで、

has_many :shares
has_many :users, :through => :shares

移行を生成する限り、これはハッキングかもしれませんが、タイプを「文字列」に変更する新しい移行を作成できます(編集:正しいコード):

class AddShareToDocuments < ActiveRecord::Migration
  def up
    change_column :documents, :share, :string
  end
  def down
    change_column :documents, :share, :array, :default => []
  end
end
3
Steve Y