Why does this Mongoid document only save one child?
I've a mongoid embedded one to one model in a Rails app (User --> Watchlist) :
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
Now resp.body, in User model is an Arry which contains several elements ( 2 in this case ):
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"
which I expect to save in the db at the end of self.create_with_omniauth(auth) method, anyway I just get one, nested "watchlist" child :
> 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") }
}
>
Pretty sure something goes wrong with this part of code:
  resp.body.each do |repo|
    user.build_watchlist(html_url: "#{repo['html_url']}", description: "#{repo['description']}")
  end
... which probably cicles for the n. array elements and exit, wich also mean the last element is saved into the DB at the end of create! method,
... but I've not idea on how to decoupling that ...
Do you have a suggestion ?
I just get one, nested "watchlist" child.
You're only getting one watchlist because that's what you told Mongoid you have:
class User
  embeds_one :watchlist  # only one watchlist
end
If you want more than one watchlist, you need to change your model:
class User
  embeds_many :watchlists
end
it helps if you use the term matching the collection you seek
embeds_many :watches or has_one :watchlist (but class Watchlist will in turn embeds_many :watch)
 
         加载中,请稍侯......
 加载中,请稍侯......
      
精彩评论