Nano Hash - криптовалюты, майнинг, программирование

Хитрое расширение монгоидной модели

Имея две модели: автомобиль (например, Audi, Mercedes) и вариант (ABS, лазерные фары, ночное видение ...). Варианты хатм автомобиля.

Предположим, что и для Audi, и для Mercedes доступна опция «Ночное видение». Но чтобы иметь его в Мерседесе, за эту опцию нужно доплатить. Итак, как я предполагаю, мне нужно как-то расширить мою модель опций, чтобы хранить дополнительную цену опций для некоторых автомобилей. Модель автомобиля я думаю тоже стоит доработать. Но не представляю как.

Моя цель добиться поведения примерно так:

Audi.options.night_vision.extra_price => ноль

Mercedes.options.night_vision.extra_price => 300

Конечно, я не хочу дублировать опцию "Ночное видение" в коллекции опций для каждой машины.

Спасибо.

02.04.2016

  • audi.options.night_vision.extra_price(audi), но не элегантное решение 03.04.2016

Ответы:


1

Это не самая простая и не самая элегантная, просто идея, которая должна работать, исходя из предположений о том, как вы могли реализовать параметры. Пожалуйста, вернитесь ко мне, если вам нужна дополнительная помощь.

Для достижения audi.options.night_vision.extra_price я предполагаю, что у вас есть такие модели, как:

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

Если приведенные выше предположения верны, вы сможете модифицировать свои классы следующим образом:

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)
19.04.2016
  • Рад, что вы нашли решение. Я не рекомендовал этот путь, потому что вам нужна область .night_vision, чтобы вы могли сделать audi.options.night_vision.extra_price, а не audi.options.first.extra_price 20.04.2016
  • извините, что ввел вас в заблуждение. На самом деле audi.options.night_vision.extra_price был своего рода псевдокодом. У автомобилей масса вариантов, так что рассматривать каждый вариант особого смысла нет. 20.04.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..