リソースの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は配列であると言います。
誰かが私が間違っていることを見つけることができますか?
すべてのデータベースをサポートする場合は、文字列で配列をシリアル化する必要があります
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
通常、配列はデータベースに格納されるタイプではありません。 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