从嵌入式文档中的数组中提取

时间:2013-03-29 20:58:05

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

我有三份文件。

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

问题是,我的代码不会从列表中删除食品。我的问题是如何循环数组,从该数组中提取项目,并期望保存新数组?

1 个答案:

答案 0 :(得分: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 ::错误:: MixedRelations)

     

问题:引用(n)列表   食品文件中通过关系协会提供的文件不是   自嵌入列表以来允许使用。

     

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