2

私はしばらく前に初心者とmongodbの初期の間違いを犯し、それらを埋め込むべきときに多くのhas_many関係を作成しました。

私の質問は、レコードを多態的な has_many シナリオからembeds_many に変換するにはどうすればよいですか?

#Place.rb
has_many :images, as: :imageable, dependent: :destroy, autosave: true

#Image.rb
belongs_to :imageable, polymorphic: true

へ =>

#Place.rb
embeds_many :images, as: :imageable

#Image.rb
embedded_in :imageable, polymorphic: true

私は通常、すべてのレコードを反復してそのように実行しますが、名前付けが問題になると思います。したがって、一時的なモデルを作成するという短い方法をどのように達成できるかわかりませんが、他の何人かが同じ間違いを犯し、おそらく穏やかな解決策を持っていることを願っていますか?

4

1 に答える 1

1

私のような人は、今後この質問を参照してください。

これを行うには、モデルを has_many からembeds_many (Ruby ベース コード) に変更してから、私が自分用に書いた次の JavaScript を使用します。

// Parent is parent model name without 's' and model is related model name without 's',
// if you have something with plural name this function don't work
// example : ref2em('user', 'post')
var ref2em = function(parent, model) {
  var query, update;
  // Search through all instances
  db[parent+'s'].find().forEach(function(ref) {
    query = {};
    // Get all related models with parent_id
    query[parent+"_id"] = ref._id;
    db[model+'s'].find(query).forEach(function(em) {
      // Update parent with $push operator (add model to parent's models attribute)
      update = { $push: {} };
      update['$push'][model+'s'] = em;
      db[parent+'s'].update({_id: ref._id}, update);
    });
  });
}

次に、次のようなものを使用します (ユーザーの has_many の投稿をユーザーのembeds_many の投稿に更新するには):

ref2em('user', 'post')

(これらの機能はすべて mongo コンソールで機能します。バックアップがあることを確認し、自分が何をしているのかを確認し、私が書いたコメントを読んで、最後に古いコレクションを削除してください)。

保証はありません。私が行ったことを共有しているだけです (おそらくあなたにはうまくいかないかもしれません)。

于 2014-01-25T11:10:51.540 に答える