我在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。数组元素和退出,也意味着最后一个元素在创建结束时保存到数据库中!方法,
...但我不知道如何解耦......
你有什么建议吗?
答案 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)