为什么这个Mongoid文档只保存一个孩子?

时间:2011-07-09 16:20:36

标签: ruby-on-rails ruby mongodb mongoid nosql

我在Rails应用中嵌入了一个mongoid one to one model(用户 - >监视列表):

class User
  include Mongoid::Document

  field :name, :type => String
  field :email, :type => String

  embeds_one :watchlist

  def self.create_with_omniauth(auth)

    conn = FaradayStack.build 'https://api.github.com'
    resp = conn.get '/users/octocat/watched'

    create! do |user|

      user.name = auth["user_info"]["name"]
      user.email = auth["user_info"]["email"]

      resp.body.each do |repo|
        user.build_watchlist(html_url: "#{repo['html_url']}")
      end
    end
  end
end

class Watchlist
  include Mongoid::Document

  field :html_url

  embedded_in :user
end

现在resp.body,在User模型中是一个包含多个元素的Arry(在这种情况下为2):

ruby-1.9.2-p136 :061 > pp resp.body.length
2
 => 2 
ruby-1.9.2-p136 :054 >   resp.body.each do |repo|
ruby-1.9.2-p136 :055 >     pp repo['html_url']
ruby-1.9.2-p136 :056?>   end
"https://github.com/octocat/Hello-World"
"https://github.com/octocat/Spoon-Knife"

我希望在self.create_with_omniauth(auth)方法结束时保存在数据库中,无论如何我只得到一个嵌套的“监视列表”子项:

> db.users.find()  
{
"_id" : ObjectId("4e1844ee1d41c843c7000003"),
"name" : "Luca G. Soave",
"email" : "luca.soave@gmail.com",
"watchlist" : { "html_url" : "https://github.com/octocat/Spoon-Knife",
                "_id" : ObjectId("4e1844ee1d41c843c7000002") }
}
>

确定这部分代码出了问题:

  resp.body.each do |repo|
    user.build_watchlist(html_url: "#{repo['html_url']}", description: "#{repo['description']}")
  end

...这可能是n的cicles。数组元素和退出,也意味着最后一个元素在创建结束时保存到数据库中!方法,

...但我不知道如何解耦......

你有什么建议吗?

2 个答案:

答案 0 :(得分:1)

  

我只是得到一个嵌套的“监视列表”孩子。

你只获得一个关注列表,因为这就是你告诉Mongoid的那个:

class User
  embeds_one :watchlist  # only one watchlist
end

如果您需要多个监视列表,则需要更改模型:

class User
  embeds_many :watchlists
end

答案 1 :(得分:1)

如果您使用匹配您所寻求的集合的术语

,它会有所帮助

embeds_many:手表 要么 has_one:watchlist(但是Watchlist将依次embeds_many:watch)