mongoid将has_many关系转换为embeds_many

时间:2012-08-04 13:12:14

标签: ruby-on-rails ruby-on-rails-3 mongoid embedded-resource mongoid3

我早些时候犯了早期的新手 - 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

to =>

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

#Image.rb
embedded_in :imageable, polymorphic: true

我通常会通过所有记录进行迭代并按照这种方式进行迭代,但我认为命名会成为一个问题。所以我不确定如何才能完成这个创建临时模型的缺点,但是我希望其他一些人犯了同样的错误并且可能有一个温和的解决方案?

1 个答案:

答案 0 :(得分: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控制台,请确保你有备份,你知道你在做什么,阅读我写的评论,最后删除旧的集合。)

不保证,我只是分享我所做的事情(可能不适合你)。