Rails: 如何通过长 :through 关系创建

Rails: How to create through a long :through relation

我想创建一个像这样的 result_unit Member.first.workouts.first.workout_sets.first.result_unit.create({"name"=>"test"}) 但我也希望有可能使用 Member.first.result_unit.create({"name"=>"test"}).

这是我的设置:

Member.rb

has_many :workouts
has_many :workout_sets, through: :workouts
has_many :result_units, through: :workout_sets

Workout.rb

belongs_to :member
has_many :workout_sets

WorkoutSet.rb

belongs_to :workout
has_one :result_unit
accepts_nested_attributes_for :result_unit

ResultUnit.rb

belongs_to :member
belongs_to :workout_set

在 WorkoutSet-Controller 中创建

def create
        @workout = current_user.workouts.find(params[:workout_id])
        @workout_set = @workout.workout_sets.create(workout_set_params)
        @result_unit = @workout.find(@workout_set).result_unit.create(result_unit_params)
        redirect_to workout_path(@workout)
    end

创建 ResultUnit 时出现错误 undefined method create for nil:NilClass

一旦定义了@workout_set,就不需要再重新找了。已经在内存中了。

@result_unit = @workout_set.create_result_unit(result_unit_params)

注意语法上的变化。看看 the Rails API documentation 的关联。对于一对一关系(belongs_tohas_one),方法是 create_other() 而不是 others.create()

此处最好的方法是将 ResultUnit 分配给 WorkoutSet。由于 WorkoutSet 与锻炼相关联,因此它将具有 result_unit.

@result_unit = @workout_set.result_unit = ResultUnit.create(result_unit_params)