これは (やや) よくある質問であることは承知していますが、私は初心者であり、私が悩んでいた問題に 2 番目 (または 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 ドル分の商品券」などがあります。
ここでの Products/Variations の embeddeds_many / embedded_in の関係は、使用する必要がある場合のプロファイルに適合するので理想的だと思います。製品 - それらは密接に関連しています。
したがって、問題は、私がこれを正しい方法で行っているかどうかです。
ryanb の優れたnested_form gem を少し調整して、基本的な 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
とにかく、先に進む前に -- 上記について考えてみたいと思います。
前もって感謝します!