我的模型设置为User<作业>课程>等级>步骤 - 用简单的英语,用户参加一个创建一个分配的课程,该分配有许多级别和许多步骤。 我正在尝试访问当前用户的当前步骤,因此我可以更改数据库中的字段。
class User < ActiveRecord::Base
has_many :assignments, dependent: :destroy
has_many :courses, through: :assignments
end
class Assignment < ActiveRecord::Base
belongs_to :user
belongs_to :course
end
class Course < ActiveRecord::Base
has_many :assignments
has_many :users, through: :assignments
has_many :levels
accepts_nested_attributes_for :levels, allow_destroy: true
end
class Level < ActiveRecord::Base
belongs_to :course
has_many :steps
accepts_nested_attributes_for :steps, allow_destroy: true
end
class Step < ActiveRecord::Base
belongs_to :level
end
我的步骤模型有一个名为“状态”的字段,它确定某个步骤是否已完成用户 - 我正在尝试访问当前用户的步骤的“状态”,因此我可以更改它或随便展示它。为了做到这一点,我需要在我的控制器中获取用户的当前步骤(不仅仅是当前步骤,因为这将改变每个人的值)。
class StepsController < ApplicationController
before_filter :authenticate_user!
def show
@course = Course.find(params[:course_id])
@level = Level.find(params[:level_id])
@step = Step.find(params[:id])
@step_list = @level.steps
// the above all work fine up to this point
@assignment = Assignment.find(params["something goes here"])
@user_step = @assignment.@course.@level.@step
end
end
当然,这不起作用。鉴于上述信息,我如何编写@user_step?
答案 0 :(得分:1)
如果我正确了解您的情况,您就无法使用目前的模型做您想做的事情。具体来说,你的Step
模型有一个状态字段是不够的(也可能没有意义)。如果您需要按每个用户逐步跟踪状态,那么您需要一个连接这两个模型并包含状态的模型,例如:
def UserStep < ActiveRecord::Base
belongs_to :users
belongs_to :steps
end
然后,您可以修改User
和Step
,以便与此模型建立has_many
关系。在StepsController#show
中,您可以访问@step.user_steps
并为您登录的用户选择UserStep
,此时您可以访问该状态。
答案 1 :(得分:0)
你有current_user吗?然后你可能应该这样做:
course = current_user.courses.find(params[:course_id])
level = course.levels.find(params[:level_id])
step = level.steps.find(params[:id])
# Do something with the step ...
您不必浏览Assignment模型,它只是一个连接用户和课程的连接模型。