我有三份文件。
User
List
Food
列表可以包含许多食物并嵌入在用户文档中。我在我的控制器中有一个动作,当用户完成食物项目时,循环遍历用户列表并删除列表与用户完成的特定食物之间的任何关联。
@user.lists.to_a.each do |list|
list.food_ids.to_a.map do |food_id|
if food_id.eql? params[:food_id]
food = Food.find(params[:food_id])
# Pull food from list
list.pull(:foods, food)
end
end
end
@user.save
我的模特
class User
# INCLUDES
# ========
include Mongoid::Document
include Mongoid::Paperclip
include Mongoid::MultiParameterAttributes
include Mongoid::Spacial::Document
# EMBEDDING
# =========
embeds_many :lists
# NESTED ATTRIBUTES
# =================
accepts_nested_attributes_for :lists
end
class List
include Mongoid::Document
has_and_belongs_to_many :foods
embedded_in :user
belongs_to: popular_list
end
class Food
# INCLUDES
# ========
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Paperclip
include Mongoid::Spacial::Document
# ASSOCIATIONS
# ============
belongs_to :user
has_and_belongs_to_many :popular_lists
end
问题是,我的代码不会从列表中删除食品。我的问题是如何循环数组,从该数组中提取项目,并期望保存新数组?
答案 0 :(得分:1)
由于两个问题,它无法正常工作:首先,您无法嵌入List
,因为您有来自/的引用(关系)。使其成为具有正常belongs_to :user
的自己的集合。
您无法与嵌入式模型建立关系,因为另一方只会存储ID。如果您使用该关系,Mongoid将调用MyEmbeddedModel.find(related_id)
找不到嵌入式模型,因为它位于另一个文档内,而不是自己的集合。
其次,您的代码缺少belongs_to :user
和has_and_belongs_to_many :foods
的对应代码。 documentation州:Definitions are required on both sides to the relation in order for it to work properly.
如果您添加这些(see my gist),Mongoid会引发错误,同时建议不要嵌入List
:
(Mongoid ::错误:: MixedRelations)
问题:引用(n)列表 食品文件中通过关系协会提供的文件不是 自嵌入列表以来允许使用。
摘要:为了正确 从食物中获取(n)列表,参考需要通过 列表的根文档。在一个简单的例子中,这将需要Mongoid 在更复杂的情况下,为根存储一个额外的外键 列表是多个级别,需要为每个级别存储密钥 父级的层次结构。解决方案:考虑不嵌入List,或 在应用程序中以自定义方式执行密钥存储和访问 代码。