如何根据另一个mongoid字段验证mongoid字段?

时间:2014-05-16 02:30:42

标签: 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
    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可以为空。

1 个答案:

答案 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使用Itemhas_many :items使用Category

编辑:如果您使用book?has_manybelongs_to就是这样的:

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

没有那么不同,但你肯定会在你的应用程序中访问item.category,我不明白为什么你不想让它变得更容易。