我切换到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
想象一下,销售书籍,电影和电子书的商店,每个销售的商品属于三个类别之一。如果项目列在" Books"类别下,则该项目需要有一个名为cover_type
的字段。此外,cover_type
只能是"精装"或" Softcover"。
保存项目时,如何将项目类别中的项目放在书籍类别中,并且因此需要存在字段cover_type
,这也被验证为&# 34;精装"或" Softcover"?
如果商品不是图书,那么cover_type
可以为空。
答案 0 :(得分:1)
Mongoid模型继承ActiveModel验证。你可以写一个custom validator method:
class Item
validates :cover_type_must_be_valid, if: :book?
def book?
Category.find(category).name == 'Books'
end
def cover_type_must_be_valid
errors.add(:cover_type, 'must be Hardcover or Softcover') unless %w{Hardcover Softcover}.include? cover_type
end
end
book?
方法令人不快;为什么不在belongs_to :category
使用Item
而has_many :items
使用Category
?
编辑:如果您使用book?
和has_many
,belongs_to
就是这样的:
def book?
category.name == 'Books'
end
没有那么不同,但你肯定会在你的应用程序中访问item.category
,我不明白为什么你不想让它变得更容易。