我想创建一个像这个Member.first.workouts.first.workout_sets.first.result_unit.create({"name"=>"test"})
的result_unit,但我也希望能够使用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
。
答案 0 :(得分:2)
一旦您定义了@workout_set,您就不需要再次重新找到它。它已经在记忆中了。
@result_unit = @workout_set.create_result_unit(result_unit_params)
请注意语法的更改。查看the Rails API documentation的关联。对于一对一关系(belongs_to
和has_one
),该方法为create_other()
而非others.create()
。
答案 1 :(得分:2)
此处最好的方法是将ResultUnit
分配给WorkoutSet
。由于WorkoutSet
与锻炼相关联,因此它将具有result_unit。
@result_unit = @workout_set.result_unit = ResultUnit.create(result_unit_params)