Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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 on rails Rails和mongo嵌入关系_Ruby On Rails_Mongodb_Mongoid_Bson - Fatal编程技术网

Ruby on rails Rails和mongo嵌入关系

Ruby on rails Rails和mongo嵌入关系,ruby-on-rails,mongodb,mongoid,bson,Ruby On Rails,Mongodb,Mongoid,Bson,我试图在Mongoid上创建一些关系,但当我试图保存内部对象或将其添加到user.personal\u accounts集合时,出现以下错误 NoMethodError: undefined method `bson_type' for #<Bank:0x71c01a8> 我期望的映射是: 使用者 个人帐户 银行 银行 正如我所读到的,我需要将外部银行复制到每个个人帐户 我已经尝试了以下方法 已安装的版本: bson (4.0.2) bson_ext (1.5.1) m

我试图在Mongoid上创建一些关系,但当我试图保存内部对象或将其添加到
user.personal\u accounts
集合时,出现以下错误

NoMethodError: undefined method `bson_type' for #<Bank:0x71c01a8>
我期望的映射是:

  • 使用者
    • 个人帐户
      • 银行
  • 银行
正如我所读到的,我需要将外部银行复制到每个个人帐户

我已经尝试了以下方法

已安装的版本:

bson (4.0.2)
bson_ext (1.5.1)
mongoid (5.0.2)
mongo (2.2.4)

问题的根源就在这里:

field :bank, type: Bank
MongoDB不知道如何存储
银行
,因此Mongoid将尝试将其转换为MongoDB在Mongoid为数据库准备数据时能够理解的内容,因此出现了
NoMethodError

想必您希望
银行
作为自己的集合存在,然后每个
个人账户
将引用一家
银行
。这将是属于设置的标准设置:

class PersonalAccount
  #... but no `field :bank`
  belongs_to :bank
end
这将在幕后添加一个
字段:bank\u id,:type=>BSON::ObjectId
个人帐户
,并为您连接访问器(
bank
)和mutator(
bank=
)方法

通常,您希望关系的另一半位于
银行

class Bank
  #...
  has_many :personal_accounts
end

但这是行不通的(正如你所发现的),因为
个人账户
嵌入了
用户
中,所以
银行
无法直接获取。请记住,
embedded\u one
只是将Mongoid机器包装在文档中的
Hash
字段周围的一种花式方法,
embedded\u many
只是将Mongoid机器包装在另一个文档中的哈希数组周围的一种花式方法;嵌入的文档没有独立的存在,它们只是父文档的一部分。

我尝试过这个解决方案,但它返回到一个混合关系错误,当我将PersonalAccount切换到has_one:bank and bank behold_to:personal_accounts时,它对对象起作用,我可以保存它,但当我再次检索它时,它不再显示银行对不起,您可能只想使用
所属的银行
而不使用
由于嵌入而拥有的多个个人账户。我更新了答案。
class PersonalAccount
  #... but no `field :bank`
  belongs_to :bank
end
class Bank
  #...
  has_many :personal_accounts
end