Добавить несколько записей в базу данных при покупке продукта - PullRequest
0 голосов
/ 19 сентября 2018

Edit # 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.

image

Оригинальный вопрос

Сценарий:

У меня есть курсы и модули, и когда пользователь покупает курс, он создается для этого курса (вроде как зачисление), когдакурс приобретается. Я также хочу, чтобы модули были помещены в отдельную таблицу, указав в файле 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
)

, и это работает

image

Но у меня есть сепТаблица arate для course_modules_users

image

Итак, скажем, например, у меня есть курс с двумя модулями, и курс с идентификатором 1 и пользователем с идентификатором 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.

1 Ответ

0 голосов
/ 19 сентября 2018

Есть два способа сделать это в зависимости от того, как и когда я хочу создать записи для 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. Я просто хочу, чтобы 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...