Дочерние атрибуты обновлены с сохранением .first_or_initialize без сохранения - Ruby on Rails - PullRequest
0 голосов
/ 08 июля 2019

У меня есть quote, в котором много shipping methods. Когда я сохраняю quote, цены на способ доставки не обновляются при использовании .first_or_initialize. Я также попытался установить autosave: true в моей ассоциации следующим образом:

quote.rb

has_many :shipping_methods, dependent: :destroy, autosave: true

У меня есть обратный звонок, который обновляет мои способы доставки и их цены (quote.rb).

before_save :refresh_shipping_rates

def refresh_shipping_rates
  ShippingMethod.refresh_rates(self, admin = true)
end

Моя функция ShippingMethod.refresh_rates (shipping_method.rb):

def refresh_rates(record, admin)
    #api call that returns a list of rates
    updated_rates.each do |i|
         rate = record.shipping_methods.where(name: i.name).first_or_initialize
         rate.price = i.price
    end
end

Моя цитата обновляется посредством отправки формы моему действию update.

def update
    @quote = Quote.find(params[:id])
    @quote.update(parameters)

    if @quote.valid?

        flash[:notice] = []
        flash[:notice] << "Successfully Updated"
        render "update"
    else
        flash[:error] = []
        @quote.errors.full_messages.each do |message|
            flash[:error] << message 
        end
        render "layouts/fail"
    end

end

Я предполагаю, что shipping_methods следует обновить просто потому, что они связаны с родительской записью, которая обновляется, даже если ни один из их атрибутов не передан через форму.

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

При вызове

 rate = record.shipping_methods.where(name: i.name).first_or_initialize

shipping_method загружается из БД в новый объект в памяти, который не связан с quote.Вы должны либо:

  1. обновить объекты, загруженные в shipping_method ассоциации (без вызова каких-либо методов, извлекающих их из БД), либо
  2. сохранить shipping methods отдельно

Я бы посоветовал попробовать 1).

0 голосов
/ 09 июля 2019

Этот метод должен быть:

def refresh_rates(record, admin)
    #api call that returns a list of rates
    updated_rates.each do |i|
         rate = record.shipping_methods.where(name: i.name).first_or_initialize
         rate.price = i.price
    end
end

до:

def refresh_rates(record, admin)
    #api call that returns a list of rates
    updated_rates.each do |i|
         rate = record.shipping_methods.where(name: i.name).first_or_initialize
         rate.price = i.price
         rate.save
    end
end

ИЛИ:

def refresh_rates(record, admin)
    #api call that returns a list of rates
    updated_rates.each do |i|
         rate = record.shipping_methods.where(name: i.name).first_or_initialize(price: i.price)
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...