Bu, en basit veya en zarif olanı, yalnızca seçenekleri nasıl uygulayabileceğinizle ilgili varsayımlara dayanarak çalışması gereken bir fikir değildir. Daha fazla yardıma ihtiyacınız varsa lütfen bana dönün.
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
Bu yapmanı sağlayacak:
audi = Car.find_by(name:'audi')
audi.options.night_vision.extra_price
yukarıdaki varsayımlar doğruysa
Sana gibi bir model olduğunu varsayalım audi.options.night_vision.extra_price ulaşmak için , bunu sevdiği sınıfları mod gerekir:
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
Bu o zaman imkan vermelidir gibi seçenekleri doldurmak için: Bir araba night_vision bulmak girişiminde eğer
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
Ve bu alacağı night_vision yoktu:
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 (audi) ancak zarif çözüm – Roger