【问题标题】:Add multiple records to database on product purchase将多条记录添加到产品购买的数据库中
【发布时间】:2018-09-19 12:26:20
【问题描述】:

编辑#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 的简单编辑。

【问题讨论】:

  • 请在您的问题中包含创建 CourseModulesUsers 的 CoursesUser 的回调
  • 请参阅编辑 #1 @Rodrigo 希望这会有所帮助

标签: ruby-on-rails ruby activerecord


【解决方案1】:

有两种方法可以做到这一点,具体取决于我希望如何以及何时创建 CourseModelUser 的记录:

  1. 我希望在创建 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
    
  2. 我只想在创建CourseUser 模型之后创建CourseModuleUser。此代码位于 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

【讨论】:

  • 那就对了,谢谢。您是否可以进一步举例说明选项,以便我能更深入地理解它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 2019-02-20
  • 1970-01-01
  • 2012-06-09
相关资源
最近更新 更多