【问题标题】:Pulling from Array in Embedded Document从嵌入式文档中的数组中提取
【发布时间】:2013-03-20 15:08:29
【问题描述】:

我有三份文件。

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

问题是,我的代码没有从列表中删除食物。我的问题是如何遍历一个数组,从该数组中拉出一个项目,并期望保存新数组?

【问题讨论】:

  • 您能发布您的ListFood 定义吗? Mongoid 不允许引用嵌入式模型,如果我 try to reproduce this 会引发异常。

标签: ruby-on-rails arrays ruby-on-rails-3 mongodb mongoid


【解决方案1】:

由于两个问题,它不起作用:首先,您不能嵌入List,因为您有来自/到它的引用(关系)。使用普通的belongs_to :user 将其设为自己的收藏。

您不能与嵌入式模型建立关系,因为对方只会存储 id。如果您使用该关系,Mongoid 将调用无法找到嵌入模型的 MyEmbeddedModel.find(related_id),因为它在另一个文档中,而不是自己的集合中。

其次,您的代码缺少 belongs_to :userhas_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::Errors::MixedRelations)

问题:引用一个(n)列表 通过关系关联来自 Food 文档的文档不是 允许,因为列表是嵌入的。

总结:为了正确 从食物中访问一个(n)列表,参考需要通过 List 的根文档。在一个简单的情况下,这将需要 Mongoid 为根存储一个额外的外键,在更复杂的情况下 列表有多个级别,需要为每个级别存储一个密钥 父级的层次结构。解决方案:考虑不嵌入列表,或 在应用程序中以自定义方式进行密钥存储和访问 代码。

【讨论】:

  • 谢谢帕斯卡。您的回答帮助我了解了我遇到的关联问题,并将帮助我解决我的问题。
猜你喜欢
  • 1970-01-01
  • 2020-03-23
  • 2017-01-21
  • 2017-02-19
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多