Rails:如何通过long创建:通过关系

时间:2015-10-21 22:22:02

标签: ruby-on-rails ruby-on-rails-4 relational-database

我想创建一个像这个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

2 个答案:

答案 0 :(得分:2)

一旦您定义了@workout_set,您就不需要再次重新找到它。它已经在记忆中了。

@result_unit = @workout_set.create_result_unit(result_unit_params)

请注意语法的更改。查看the Rails API documentation的关联。对于一对一关系(belongs_tohas_one),该方法为create_other()而非others.create()

答案 1 :(得分:2)

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

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