Форма «Вложенные поля» получает ошибку при попытке добавить запись ассоциации заполнителя в Rails 5 - PullRequest
0 голосов
/ 29 мая 2018

У меня есть две модели Rails: workout, measurable.Когда я захожу в форму для редактирования тренировки, я получаю следующую ошибку:

Ошибка при посещении тренировки # edit

*** ActiveRecord::NotNullViolation Exception: TinyTds::Error: Cannot insert the value NULL into column 'value', table 'bane-development.dbo.measurables'; column does not allow nulls. INSERT fails.: EXEC sp_executesql N'INSERT INTO [measurables] ([measurable_type_id], [workout_id], [created_at], [updated_at], [import_key]) OUTPUT INSERTED.[id] VALUES (@0, @1, @2, @3, @4)', N'@0 int, @1 int, @2 datetime, @3 datetime, @4 int', @0 = 3, @1 = 689349, @2 = '05-29-2018 09:22:45.206', @3 = '05-29-2018 09:22:45.206', @4 = -1

Что я пытаюсьДля этого нужно заполнить форму Rails workout, чтобы пользователь мог заполнить различные измеряемые величины для добавления в тренировку.Однако я не хочу, чтобы они сохранялись в базе данных, если они не имеют значения.Но когда следующая строка выполняет self.measurables << Measurable.new(measurable_type_id: measurable_type.id, order_by: 1, import_key: -1) - кажется, что она пытается сохранить в базу данных, когда я этого пока не хочу ... Я просто хочу, чтобы она предоставила пользовательские поля для ввода данных, если они захотят.Как получить добавление ассоциации к форме, но не сохранять запись, пока я не обновлю объект workout?

workout.rb

class Workout < ApplicationRecord
  before_validation :remove_blank_measurables

  has_many :measurables, inverse_of: :workout
  accepts_nested_attributes_for :measurables, :allow_destroy => true, reject_if: proc {|m| m[:value].blank?}

  def add_missing_measurable_types
    MeasurableType.workout_observations.each do |measurable_type|
      if !self.has_measurable_type?(measurable_type)
        self.measurables << Measurable.new(measurable_type_id: measurable_type.id, order_by: 1, import_key: -1)
      end
    end
  end

end

измеряемый.rb

class Measurable < ApplicationRecord
  belongs_to :workout
end

тренировки # редактировать

def edit
  @workout.add_missing_measurable_types
end

1 Ответ

0 голосов
/ 29 мая 2018

Из документации

collection << (object,…) </strong> Добавляет один или несколько объектов в коллекцию путем создания ассоциаций в таблице соединений(collection.push и collection.concat являются псевдонимами этого метода). Обратите внимание, что эта операция немедленно запускает обновление SQL без ожидания вызова сохранения или обновления родительского объекта , если родительский объект не является новой записью.

'<<' (оператор лопаты) запускает обновление / сохранение, вместо этого следует использовать </p>

self.measurables.new(measurable_type_id: measurable_type.id, order_by: 1, import_key: -1)
...