使用embeds_many / embedded_in关系对Rails3 / Mongoid中的产品变体进行建模....

时间:2012-11-29 04:47:34

标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid

我知道这是一个(有点)常见的问题,但我是一个新手,我总是欣赏第二眼(或第100眼)对我正在兜售的问题的看法。

我想知道我是否采取了正确的方法 - 我正在尝试对具有多种变化的产品进行建模,并针对该产品销售相关的礼品券。

例如,餐馆的产品可能是“2的品尝菜单”,而变化可能是“仅限食物”,“与部分葡萄酒配对”,“与完整的葡萄酒搭配”等等(仅限于说明性例子)。

这是我提出的一个提炼版本:

class Product
  include Mongoid::Document

  field :name, type: String

  has_many :gift_certificates
  embeds_many :variations
end

class Variation
  include Mongoid::Document

  field :name, type: String

  embedded_in :product
  has_many :gift_certificates      
end

class GiftCertificate
  include Mongoid::Document

  field :recipient, type: String
  field :amount, type: Float

  belongs_to :product
  belongs_to :variation
end

因此,当我们创建GiftCertificate时,它被定义为属于产品和变体(这是正确的吗?)。一个例子可能是“2份[产品]品尝菜单的200美元礼券,含有部分葡萄酒配对[变种]”等。

我觉得这里的embeds_many / embedded_in关系对于产品/变体是理想的,因为它适合应该使用的时间:我永远不会访问没有变化的产品,我永远不需要访问变体独立于产品 - 它们齐头并进。

所以问题是我是否以正确的方式这样做。

我已经设法使用ryanb的优秀nested_form宝石按摩基本的CRUD表格,并进行了一些调整。编辑产品&变化很容易(基本用例),但是在使用礼品券时我遇到了麻烦。

Mongoid给我带来了一些麻烦......同时属于产品及其变体的GiftCertificate似乎很糟糕,我每次进行查找时都必须手动设置GiftCertificate.variation,即

@gc = GiftCertificate.find(params[:id]) // as normal
@gc.variation // ==> nil, doesn't work by itself
@gc.variation = @gc.product.variations.find(@gc.variation_id) // Have to manually set this
@gc.variation // Now this works as it's supposed to

无论如何,在我继续之前 - 会喜欢对上述内容有所了解。

提前致谢!

0 个答案:

没有答案