Почему этот монгоидный документ спасает только одного ребенка? - PullRequest
0 голосов
/ 09 июля 2011

У меня есть монгоид, встроенный модель один в один в приложении Rails (Пользователь -> Список наблюдения):

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

Теперь, соответственно, в пользовательской модели есть 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. элементы массива и выход, что также означает, что последний элемент сохраняется в БД в конце создания! метод

... но я не представляю, как отделить это ...

У вас есть предложение?

Ответы [ 2 ]

1 голос
/ 10 июля 2011

полезно, если вы используете термин, соответствующий искомой коллекции

embeds_many: watches или has_one: список (но список наблюдения класса, в свою очередь, будет embeds_many: watch)

1 голос
/ 09 июля 2011

Я только что получил одного вложенного «списка наблюдения» ребенка.

Вы получаете только один список наблюдения, потому что вы сказали Mongoid, что у вас есть:

class User
  embeds_one :watchlist  # only one watchlist
end

Если вам нужно более одного списка наблюдения, вам нужно изменить модель:

class User
  embeds_many :watchlists
end
...