建立一个has_many关系,避免孩子存储paretn的id

时间:2015-01-15 19:12:34

标签: ruby-on-rails mongoid

class User
  include Mongoid::Document

  has_many :favorites, class_name: "Item"
end

class Item
 include Mongoid::Document
 belongs_to :user, dependent: :nullify

end

我希望用户拥有一个收藏夹数组,但在Item集合中,不存储user_id。我遵循的方法是否正确?

如果我尝试将用户收藏夹作为User.last.favourites或尝试将收藏夹添加到用户,则需要永远。这是为什么?

由于

2 个答案:

答案 0 :(得分:0)

我相信您错过了embedded_in :user班级的Item

答案 1 :(得分:0)

class User
  include Mongoid::Document
  has_many :favorites, class_name: "Item"
end

class Item
 # class is all lower case
 include Mongoid::Document
 # remove the relation to the user form the item
 # so that it cannot save the user_id 
end

以前的代码应该可以使用,并且不允许您将user_id保存在收藏夹中。

所以此代码应该有效user.last.favorites #=> [Array of favorites] 但此代码将通过异常user.last.favorites.last.user #=> method user not found

  • 为什么需要永远?除非我看过日志,否则无法判断。

也没有选择嵌入式解决方案,只能从父母那里访问嵌入式系列......我认为这不是你想要实现的......

用更简单的话说:如果你有一个被称为' rails'的喜爱, 使用其他答案中描述的嵌入式解决方案将导致以下行为

p Favorites.all.to_a
#=> []
p user.first.favorites.first
#=> <Favorite id: 1, name: rails>
p user.last.favorites.first
#=> <Favorite id: 100, name: rails>

如果您注意到:

  • 除了嵌入它的父级之外,集合不可查询。
  • 收藏夹集合对每个用户而言是唯一的。 2个不同的用户不能共享相同的嵌入式文档(与前面的代码一样,第一个和最后一个用户都有相同的喜欢(你想要的)但它们实际上是2个完全不同的对象。

使用has_many关系的相同代码将导致以下

p Favorites.all.to_a
#=> [<<Favorite id: 1, name: rails>]
p user.first.favorites.first
#=> <Favorite id: 1, name: rails>
p user.last.favorites.first
#=> <Favorite id: 1, name: rails>

# this is pseudocode but you will get the idea
user.last.favorites.first.name = `rails4` # then save

p user.first.favorites.first
#=> <Favorite id: 1, name: rails4>
p user.last.favorites.first
#=> <Favorite id: 1, name: rails4>