Ruby 如何基于另一个mongoid字段验证一个mongoid字段?

Ruby 如何基于另一个mongoid字段验证一个mongoid字段?,ruby,sinatra,mongoid,Ruby,Sinatra,Mongoid,我切换到了nosql,正在和Sinatra玩Mongoid。我对这一点还不熟悉,我被这个问题难住了 class Item field :name, type: String field :category, type: Moped::BSON::ObjectId # holds _id of the category object field :cover_type, type: String validates_presence_of :category

我切换到了nosql,正在和Sinatra玩Mongoid。我对这一点还不熟悉,我被这个问题难住了

class Item
    field :name, type: String
    field :category, type: Moped::BSON::ObjectId    # holds _id of the category object
    field :cover_type, type: String

    validates_presence_of :category
    validates_inclusion_of :cover_type, in:["Hardcover", "Softcover"]
end

class Category
    field :name

    validates_inclusion_of :name, in:["Books", "Movies", "Ebooks"]
end
想象一下,一家出售书籍、电影和电子书的商店,出售的每一件商品都属于这三个类别中的一个。如果一件商品被列在“书籍”类别下,那么该商品需要有一个名为
封面类型
的字段。此外,
封面类型
只能是“精装”或“软封面”

保存项目时,当项目属于图书类别,因此需要存在字段
封面类型
,该字段也被验证为“精装”或“软封面”,如何在项目类中拼凑验证


如果项目不是书籍,则封面类型可以为空。

Mongoid模型继承ActiveModel验证。您只需编写一个:

book?
方法令人不快;为什么不在
项目上使用
属于:category
类别上有许多:items

编辑:以下是
书的内容?
如果您使用的
有很多
,并且
属于
,那么它可能会是什么样子:

def book?
  category.name == 'Books'
end

没有什么不同,但是你肯定会访问
项目。在你的应用程序中,分类
,我看不出你为什么不想让它变得更简单。

你能解释一下为什么
书籍?
令人不快吗?如果我改为使用
类别
上有很多:项目
,并且
属于:分类
,怎么样我会强制要求
项目中的
封面类型只能是软封面和精装封面吗?这很令人不快,因为它必须按ID查找
类别,而Mongoid/ActiveModel给出的
属于
,正是出于这个原因。我已经更新了答案,如果你使用这些便利,会发生什么方法。
def book?
  category.name == 'Books'
end