これは最も簡単ではなく、最もエレガントでもなく、オプションの実装方法に関する前提に基づいて動作するアイデアでもありません。もっと助けが必要な場合は、私に戻ってください。
class car
include Mongoid::Document
field :name, type: String
has_and_belongs_to_many :options do
def night_vision
@target.find_by(name:'night_vision')
end
end
end
class option
include Mongoid::Document
field :name, type: String
field :extra_price, type: Float
has_and_belongs_to_many :cars
end
これを行うためにあなたを可能にする:
audi = Car.find_by(name:'audi')
audi.options.night_vision.extra_price
上記の仮定が正しい場合は、次のようなモデルを持っていることを私は仮定audi.options.night_vision.extra_priceを達成するために
次のようにクラスを変更することができます:
class option
include Mongoid::Document
attr_accessor :extra_price
field :name, type: String
has_and_belongs_to_many :cars
embeds_many :extras
end
class extra
include Mongoid::Document
field :car_id, type: String
field :price, type: String
embedded_in :option
end
class car
include Mongoid::Document
field :name, type: String
has_and_belongs_to_many :options do
def night_vision
extra = @target.find_by(name:'night_vision')
extra_price = extra.prices.find_by(car_id: @target._id.to_s) if extra
extra.extra_price = extra_price.price if extra && extra_price
return extra
end
def find_or_create_option(args)
extra = @target.find_or_create_by(name:args)
price = extra.extras.find_or_create_by(car_id:@target._id.to_s)
price.set(price: args.price
end
end
end
以下のようなあなたのオプションを設定するために:
audi.options.find_or_create_option({name:'night_vision', price:2310.30})
bmw.options.find_or_create_option({name:'night_vision', price:1840.99})
audi.options.night_vision.extra_price
=> 2310.30
bmw.options.night_vision.extra_price
=> 1840.99
そして、あなたはあなたが得るでしょうnight_vision持っていなかった車にnight_visionを見つけるためにしようとした場合:
skoda.options.night_vision
=> nil
skoda.options.night_vision.extra_price
=> NoMethodError (undefined method 'extra_price' for nil:NilClass)
audi.options.night_vision.extra_price(アウディ)はありませんエレガントなソリューション – Roger