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_to
和 has_one
),方法是 create_other()
而不是 others.create()
。
此处最好的方法是将 ResultUnit
分配给 WorkoutSet
。由于 WorkoutSet
与锻炼相关联,因此它将具有 result_unit.
@result_unit = @workout_set.result_unit = ResultUnit.create(result_unit_params)
我想创建一个像这样的 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_to
和 has_one
),方法是 create_other()
而不是 others.create()
。
此处最好的方法是将 ResultUnit
分配给 WorkoutSet
。由于 WorkoutSet
与锻炼相关联,因此它将具有 result_unit.
@result_unit = @workout_set.result_unit = ResultUnit.create(result_unit_params)