Rails和mongo嵌入了关系

时间:2016-03-15 21:41:46

标签: ruby-on-rails mongodb mongoid bson

我正在尝试在Mongoid上创建一些关系但是当我尝试保存内部对象或将其添加到user.personal_accounts集合时,我收到以下错误

NoMethodError: undefined method `bson_type' for #<Bank:0x71c01a8>

我在rails控制台中的对象是正确的

#<PersonalAccount _id: 56e87f669c27691be0d3041b, number: "55", active: true, bank: #<Bank _id: 56d74cdb9c27692fb4bd4c6d, code: 123, name: "Bradesco", country: "USA">>

我的映射

class PersonalAccount
  include Mongoid::Document

  field :number, type: String
  field :active, type: Boolean
  field :bank, type: Bank

  embedded_in :user
end

class User
  include Mongoid::Document

  field :first_name, type: String
  field :last_name, type: String
  embeds_many :personal_accounts

end

class Bank
  include Mongoid::Document

  field :code, type: Integer
  field :name, type: String
  field :country, type: String
end

我期待的映射是:

  • 用户
    • PersonalAccounts
      • 银行
  • 银行

正如我所读到的,我需要将外部银行复制到每个PersonalAccount。

我已尝试过以下Link

已安装的版本:

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

1 个答案:

答案 0 :(得分:2)

问题的根源就在这里:

field :bank, type: Bank

MongoDB不知道如何存储Bank所以Mongoid将尝试将其转换为MongoDB在为数据库准备数据时将理解的内容,因此NoMethodError

据推测,您希望Bank作为自己的集合存在,然后每个PersonalAccount都会引用Bank。这将是一个标准belongs_to设置:

class PersonalAccount
  #... but no `field :bank`
  belongs_to :bank
end

这将在幕后添加field :bank_id, :type => BSON::ObjectIdPersonalAccount并为您添加访问器(bank)和mutator(bank=)方法。

通常,您需要Bank中的另一半关系:

class Bank
  #...
  has_many :personal_accounts
end

但由于PersonalAccount已嵌入User内,因此无法正常工作(因为您发现),因此Bank无法直接获取它。请记住,embeds_one只是将Mongoid机器包裹在文档中的Hash字段周围,embeds_many只是将Mongoid机制包裹在一系列哈希中的奇特方式在另一份文件中;嵌入式文档不具有独立存在性,它们只是其父级的一部分。