У меня есть две модели 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