Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Mongoid/Moped更新嵌入文档-ArgumentError-参数数量错误(2代表1)_Ruby_Mongodb_Sinatra_Mongoid_Moped - Fatal编程技术网

Ruby Mongoid/Moped更新嵌入文档-ArgumentError-参数数量错误(2代表1)

Ruby Mongoid/Moped更新嵌入文档-ArgumentError-参数数量错误(2代表1),ruby,mongodb,sinatra,mongoid,moped,Ruby,Mongodb,Sinatra,Mongoid,Moped,我在更新Ruby/Sinatra应用程序中的嵌入式文档时遇到问题。我试图在update语句中使用位置运算符“$”,以便从嵌入的数组中选择正确的文档。但这是抛出一个“ArgumentError-错误数量的参数(2代表1)”错误 带有硬编码数组索引的简单update语句可以正常工作。所以也许Mongoid/Moped不支持位置操作员?。。。虽然从我所能看到的,它看起来应该 有人知道最好的方法是什么吗?在我的控制器中使用Ruby,有没有其他方法来确定子文档索引,而不必遍历它们——这是计划B,但看起来非

我在更新Ruby/Sinatra应用程序中的嵌入式文档时遇到问题。我试图在update语句中使用位置运算符“$”,以便从嵌入的数组中选择正确的文档。但这是抛出一个“ArgumentError-错误数量的参数(2代表1)”错误

带有硬编码数组索引的简单update语句可以正常工作。所以也许Mongoid/Moped不支持位置操作员?。。。虽然从我所能看到的,它看起来应该

有人知道最好的方法是什么吗?在我的控制器中使用Ruby,有没有其他方法来确定子文档索引,而不必遍历它们——这是计划B,但看起来非常脆弱

这是我的基本设置:我有“客户”

。。。嵌入“联系人”

在我的控制器中,我获得了客户(pk)和要更新的特定嵌入文档(联系pk)的ID:


update
类方法实际上是
Customer。默认范围为.update
,这意味着
update
实际上是
Mongoid::Criteria
中的
update
方法,并且:

请注意,它只接受一个
属性
参数?这就解释了错误消息。您可能希望
update
的工作方式与MongoDB shell或JavaScript界面中的工作方式相同

首先,您需要找到感兴趣的文档,然后致电
update

Customer.where('_id' => Moped::BSON::ObjectId(pk), 'contacts._id' => Moped::BSON::ObjectId(contact_pk))
        .update($set => { 'contacts.$.first_name' => 'Bob' })

成功了!我真的很难理解MongoDB shell和使用Mongoid/Moped在Ruby中工作的东西之间的区别。您知道有任何教程或更高级别的文档演示如何组合基于Mongoid::Criteria的查询吗?虽然这正是我需要的方向盘-谢谢!
class Contact
    include Mongoid::Document
    field :first_name, type: String

    attr_accessible :first_name

    embedded_in :customer
end
Customer.update(
                 { 
                   "_id" => Moped::BSON::ObjectId(pk),"contacts._id" => Moped::BSON::ObjectId(contact_pk)
                 },
                 {
                   $set => {"contacts.$.first_name" => "Bob" }
                 }
                ) 
# Update the first matching document atomically.
#
# @example Update the first matching document.
#   context.update({ "$set" => { name: "Smiths" }})
#
# @param [ Hash ] attributes The new attributes for the document.
#
# @return [ nil, false ] False if no attributes were provided.
#
# @since 3.0.0
def update(attributes = nil)
  update_documents(attributes)
end
Customer.where('_id' => Moped::BSON::ObjectId(pk), 'contacts._id' => Moped::BSON::ObjectId(contact_pk))
        .update($set => { 'contacts.$.first_name' => 'Bob' })