Не удается сохранить атрибут для модели с тройным вложением Rails - PullRequest
1 голос
/ 08 октября 2019

Я ищу помощь в создании и сохранении объекта. У меня есть три связанных модели, WorkoutType, ExerciseType и WeightUnit:

class WorkoutType < ActiveRecord::Base
    attr_accessor :exercise_type_attributes, :workout_type_id, :weight_unit_id
    has_many :exercise_types, dependent: :destroy
    belongs_to :user
    accepts_nested_attributes_for :exercise_types
end

class ExerciseType < ActiveRecord::Base
    attr_accessor :workout_type_id, :weight_unit_id
    belongs_to :workout_type
    has_many :exercises
    belongs_to :weight_unit
end

class WeightUnit < ActiveRecord::Base
    has_many :exercise_types
end

Это соответствующие схемы таблиц:

create_table "workout_types", force: :cascade do |t|
    t.string   "type_name"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.integer  "user_id"
    t.boolean  "public"
    t.text     "description"
    t.boolean  "is_visible"
  end

create_table "exercise_types", force: :cascade do |t|
    t.string   "name"
    t.integer  "sets"
    t.integer  "reps"
    t.integer  "workout_type_id"
    t.datetime "created_at",      null: false
    t.datetime "updated_at",      null: false
    t.string   "load"
    t.string   "url"
    t.integer  "weight_unit_id"
  end

create_table "weight_units", force: :cascade do |t|
    t.string  "name"
    t.decimal "conversion_factor_to_lb", precision: 10, scale: 4
  end

WorkoutType создается с использованием формы, которая включает в себя ExerciseTypes и WeightUnitsпоказано в это изображение .

Новый WorkoutType создается по методу new WorkoutTypesController:

def new
    @workout_type = WorkoutType.new
    @exercise_types = Array.new(10) { @workout_type.exercise_types.build }
end 

Он сохраняется с использованием метода создания:

def create
    @workout_type = current_user.workout_types.create(workout_type_params)
    @exercise_types = @workout_type.exercise_types
end

def workout_type_params
    params.require(:workout_type).permit(:type_name, :public, :description, :exercise_types_attributes => [:id, :name, :sets, :reps, :load, :url, :weight_unit_id])
end

Проблема в том, что при сохранении нового WorkoutType поле weight_unit_id в ExerciseTypes не сохраняется. В терминале я вижу, что он передается формой в качестве параметра:

Started POST "/workout_types" for 10.0.2.2 at 2019-10-07 22:01:22 +0000
Processing by WorkoutTypesController#create as HTML

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"...", "workout_type"=>{"type_name"=>"Test Routine 10", "description"=>"<p>uygyu</p>", "public"=>"true", "exercise_types_attributes"=>{"0"=>{"name"=>"exercise 1", "sets"=>"2", "reps"=>"34", "load"=>"90", "weight_unit_id"=>"2", "url"=>""},
}}

Но когда приходит время сохранения в базе данных, я вижу, что weight_unit_id не включается в INSERT INTO "exercise_types" оператор:

   (0.0ms)  BEGIN
  SQL (0.0ms)  INSERT INTO "workout_types" ("type_name", "public", "description", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["type_name", "Test Routine 9"], ["public", "t"], ["description", "<p>great new description</p>"], ["user_id", 1], ["created_at", "2019-10-07 22:01:24.429003"], ["updated_at", "2019-10-07 22:01:24.429003"]]
   SQL (0.0ms)  INSERT INTO "exercise_types" ("name", "sets", "reps", "load", "url", "workout_type_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"  [["name", "exercise 1"], ["sets", 2], ["reps", 34], ["load", "90"], ["url", ""], ["workout_type_id", 23], ["created_at", "2019-10-07 22:11:11.522873"], ["updated_at", "2019-10-07 22:11:11.522873"]]

После сохранения weight_unit_id для WorkoutType равно nil. Я предполагаю, что мне нужно создать объекты WeightUnits в методе создания. Но как я могу это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...