我试图在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

我期望的映射是:
用户
个人帐户
银行
银行
因为我已经读过了,我需要把外部银行复制到每个个人账户上。
我已经尝试过以下Link
安装的版本:
bson (4.0.2)
bson_ext (1.5.1)
mongoid (5.0.2)
mongo (2.2.4)

最佳答案

问题的根源就在这里:

field :bank, type: Bank

MongoDB不知道如何存储Bank,所以Mongoid会尝试将其转换为MongoDB在为数据库准备数据时能够理解的内容,因此NoMethodError
假设您希望Bank作为自己的集合存在,那么每个PersonalAccount都将引用一个Bank。这将是一个标准的设置:
class PersonalAccount
  #... but no `field :bank`
  belongs_to :bank
end

这将在幕后添加一个belongs_tofield :bank_id, :type => BSON::ObjectId并为您连接访问器(PersonalAccount)和变异器(bank)方法。
通常情况下,您希望关系的另一半在bank=中:
class Bank
  #...
  has_many :personal_accounts
end

但这是行不通的(正如你所发现的),因为Bank嵌入到PersonalAccount中,所以User不能直接得到它。请记住,Bank只是将mongoid机器包装在文档中的一个embeds_one字段上的一种幻想,Hash只是将mongoid机器包装在另一个文档中的散列数组上的一种幻想;嵌入的文档没有独立的存在,它们只是他们的父母。

关于ruby-on-rails - Rails和mongo嵌入了关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36022769/

10-11 19:59