Ruby on rails Rails和mongo嵌入关系
我试图在Mongoid上创建一些关系,但当我试图保存内部对象或将其添加到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
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