Ruby on rails MongoDB验证从has_失败,并且_属于_多个关系

Ruby on rails MongoDB验证从has_失败,并且_属于_多个关系,ruby-on-rails,ruby,mongodb,mongoid,Ruby On Rails,Ruby,Mongodb,Mongoid,我正在构建一个简单的脚本来填充MongoDB数据库。这是我第一次使用NoSQL数据库,我觉得我可能是从SQL数据库的角度考虑这个问题 此脚本的基础是填充一个数据库,该数据库包含几个相互关联的集合。但是,当我运行脚本时,我在构建/保存文档时看到一个无效错误 我有三个收藏书籍、作者和风格,具有以下关系 一本书有许多作者 一个作者有许多书籍 一个作者有许多风格 一种风格有许多作者 模型定义如下: #图书模型 课堂用书 include Mongoid::Document 包含Mongoid::时间戳

我正在构建一个简单的脚本来填充MongoDB数据库。这是我第一次使用NoSQL数据库,我觉得我可能是从SQL数据库的角度考虑这个问题

此脚本的基础是填充一个数据库,该数据库包含几个相互关联的集合。但是,当我运行脚本时,我在构建/保存文档时看到一个无效错误

我有三个收藏<代码>书籍、
作者
风格
,具有以下关系

  • 一本
    有许多
    作者
  • 一个
    作者
    有许多
    书籍
  • 一个
    作者
    有许多
    风格
  • 一种
    风格
    有许多
    作者
模型定义如下:

#图书模型
课堂用书
include Mongoid::Document
包含Mongoid::时间戳
字段:标题,类型:字符串
验证:标题,状态:true
_和_属于_许多作者吗
索引({title:'text'})
结束
#作者模型
类作者
include Mongoid::Document
包含Mongoid::时间戳
字段:名称,类型:字符串
验证:名称,状态:true
你和你属于很多书吗
有很多种风格吗
索引({name:1},{unique:true})
结束
#样式模型
班级风格
include Mongoid::Document
包含Mongoid::时间戳
字段:类型,类型:字符串
验证:类型,状态:true
_和_属于_许多作者吗
索引({type:1},{unique:true,name:“type_index”})
结束
这是我的剧本:

#script.rb
书
book.title=“好兆头”
['Neil Gaiman','Terry Pratchett'],每个人都有作者的名字|
author=author.find_by(姓名:author_name)
如果是.nil?
author=author.new(名称:author\u name)
结束
#作者可以拥有的写作风格列表
#假设每个作者都有一个样式列表
文学风格。每个人都有自己的名字|
style=style.find_by(type:style_name)
如果没有?
author.styles.build(Style.new(type:Style\u name))
其他的
除非author.styles.include?style.id
作者:我错了
author.errors#=>@messages={:styles=>[“无效”]}
book.author.build(book.attributes)
保存
结束
创建了
书籍
文档,但由于无效的样式验证错误,
作者
样式
不会持续存在。我希望我能确切地看到是什么导致验证失败,但是消息传递非常模糊。我怀疑它来自于
has\u和
Author
Style
之间的许多关系中的一些内置验证,但我无法确定它

我发现有趣的是,
Book
文档有一个
author\u id
属性,该属性中填充了id,但是当我跳入控制台时,没有作者可以被拉到或绑定到
书籍


如果需要的话,我很乐意提供更多信息。

我想我需要知道更多的信息来明确告诉您问题所在——您使用的是什么版本的Mongoid?您是在空数据库上运行此脚本,还是作者和样式文档已经存在?那些看起来像什么

话虽如此,我确实在您的脚本中看到了几个bug,但我不确定它们是否导致了您的问题:

  • 我相信if语句中的行将抛出一个错误。相反,它应该说
    author.styles.build(type:style\u name)

  • 除非author.styles.include?style.id
    作者风格
    
    if style.nil?
          author.styles.build(Style.new(type: style_name))
    else
          ...
    
    unless author.styles.include? style.id
        author.styles << style
    end