Проверяет уникальность записи на пользователя за урок // Rails 4

Проблема: я хочу иметь только 1 UserLesson для каждого пользователя на видео, потому что я строю систему отслеживания (систему прогресса). Пользователь должен видеть, сколько уроков осталось на урок / общее количество уроков, а также, если он помечен как завершенный, необходимо добавить css.

Я отправляю данные из представления в контроллер:

 <%= link_to 'Mark as completed', user_lessons_path(@user_lesson, user_lesson: {user_id: current_user.id, lesson_id: @lesson.id}), :method => :post, class: 'btn btn-primary-big' %>

Контроллер получает данные и запускает метод создания

 class UserLessonsController < ApplicationController
  before_filter :set_user_and_lesson

  def show
  end 

  def create
    @user_lesson = UserLesson.create(user_lesson_params)
    if @user_lesson.save
      flash[:success] = "You rock! Keep up ;)"
        redirect_to(:back)
    else
     flash[:success] = "You have already completed this lesson"
     redirect_to(:back)
   end
 end

  private

   def user_lesson_params 
      params.require(:user_lesson).permit(:user_id, :lesson_id, :completed)
end
end

Вот модель отношений

class UserLesson < ActiveRecord::Base
    belongs_to :user 
    belongs_to :lesson
    # validates_uniqueness_of :user_lesson, :scope => [:user, :lesson]
    end

 class Lesson < ActiveRecord::Base
    has_one :lecture, through: :chapter
   belongs_to :chapter 
 end

class User < ActiveRecord::Base
   has_many :enrollments
   has_many :user_lessons
   has_many :lectures, through: :enrollments
   accepts_nested_attributes_for :enrollments
 end

class Enrollment < ActiveRecord::Base
    belongs_to :user 
    belongs_to :lecture
    validates :lecture, uniqueness: { scope: :user, message: "should happen once per user" }
end

class Lecture < ActiveRecord::Base
    belongs_to :category
    has_many :lessons, through: :chapters, dependent: :destroy 
    has_many :chapters
    belongs_to :teacher

    # For course user relationship 
    has_many :enrollments 
    has_many :users, through: :enrollments

    accepts_nested_attributes_for :enrollments
    accepts_nested_attributes_for :chapters
 end

class Chapter < ActiveRecord::Base
    has_many :lessons
    belongs_to :lecture
    accepts_nested_attributes_for :lessons
end

Моим предположением было подтверждение уникальности пользовательского урока для каждого пользователя и урока. Однако не может работать, получил сообщение об ошибке.

1 ответ

Решение

Добавьте эту проверку в вашу модель, чтобы обеспечить уникальность по объему пользователя:

 validates :lesson_id, :uniqueness => {:scope=>:user_id}
Другие вопросы по тегам