编辑#1
这是我在付款控制器中尝试创建CourseModulesUser
的目的CourseModules.count do
CourseModulesUser.create.times(
course_module_id: @course_module_id,
courses_user_id: @courses_user_id,
complete: false
)
end
我有一个课程模块,但是为了创建用户,我需要能够为购买的课程计算模块,然后在CourseModulesUser中获取记录(同时获取course_user_id和course_module_id)。
常见问题
场景:
我有课程和模块,并且当用户购买课程时,会为该课程创建用户(有点像注册),但是,当购买课程时,我也希望模块进入单独的表格中在course_module_id和courses_user_id中。
但是,每个课程有多个模块
这是付款控制者
class PaymentsController < ApplicationController
before_action :authenticate_user!
def create
token = params[:stripeToken]
@course = Course.find(params[:course_id])
@user = current_user
begin
charge = Stripe::Charge.create(
amount: (@course.price*100).to_i,
currency: "gbp",
source: token,
description: params[:stripeEmail],
receipt_email: params[:stripeEmail]
)
if charge.paid
Order.create(
stripe_id: charge.id,
course_id: @course.id,
user_id: @user.id,
total: @course.price,
card_last4: charge.source.last4,
card_type: charge.source.brand,
card_exp_month: charge.source.exp_month,
card_exp_year: charge.source.exp_year
)
CoursesUser.create(
course_id: @course.id,
user_id: @user.id,
complete: false
)
flash[:success] = "Your payment was processed successfully"
end
rescue Stripe::CardError => e
body = e.json_body
err = body[:error]
flash[:error] = "Unfortunately, there was an error processing your payment: #{err[:message]}"
end
redirect_to course_path(@course)
end
end
这是我正在创建课程用户的地方
CoursesUser.create(
course_id: @course.id,
user_id: @user.id,
complete: false
)
这有效
但是我为Course_modules_users有一个单独的表
例如,假设我有一门课程包含两个模块,一门课程的ID为1,一用户的ID为1,理想情况下,我会遇到这样的事情
id course_module_id courses_user_id complete
1 1 1 false
2 2 1 false
因此,当用户购买课程时,两个模块都应在此表中创建记录。
这就是我的模型
class CourseModulesUser < ApplicationRecord
belongs_to :course_module
belongs_to :courses_user
after_update :update_courses_user, if: :completed?
def siblings
self.class.where(courses_user_id: self.courses_user_id)
end
def completed!
self.update_attributes(complete: true)
end
def completed?
siblings.all?(&:complete?)
end
def update_courses_user
self.courses_user.completed!
end
end
但是我认为这只是对PaymentsController的简单编辑。
答案 0 :(得分:0)
有两种方法可以执行此操作,具体取决于我希望如何以及何时创建CourseModelUser
的记录:
我希望在创建记录CourseUser
的同时创建记录(如果由于某种原因未创建CourseUser
,则不应创建CourseModuleUser
以及)。此代码与您在付款控制器中创建的CourseUser
一同出现。
ActiveRecord::Base.transaction do
CoursesUser.create(
course_id: @course.id,
user_id: @user.id,
complete: false
)
module_ids = CourseModule.where(course_id: @course.id).pluck(:id)
module_ids.each do |module_id|
CourseModuleUser.create(
course_module_id: module_id,
courses_user_id: @user.id,
completed: false
)
end
end
我只希望在创建CourseModuleUser
模型之后创建CourseUser
。这段代码位于CourseUser
模型中。
after_commit :create_couser_module_user
def create_module_user
module_ids = CourseModule.where(course_id: self.course_id).pluck(:id)
module_ids.each do |module_id|
CourseModuleUser.create(
course_module_id: module_id,
courses_user_id: self.id,
completed: false
)
end
注意:答案假定您具有以下模型结构:
class Course
..
has_many :course_modules
..
end
class CourseModule
..
belongs_to :course
..
end