проверка has_and_belongs_to_many, так что пользователи не могут применять несколько раз к семинару - PullRequest
4 голосов
/ 18 августа 2011

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

Это код для применения

      #apply to workshop
        def apply
          @workshop = Workshop.find(params[:id])
          @workshop.users << @current_user
          if @workshop.save
            @workshop.activities.create!({:user_id => @current_user.id, :text => "applied to workshop"})
            flash[:success] = "You successfully applied for the workshop"
            redirect_to workshop_path(@workshop)
          else
            flash[:error] = "You can't apply multiple times for the same workshop"
            redirect_to workshop_path(@workshop)
          end
        end

Модель Мастерской выполняет следующую проверку:

      has_and_belongs_to_many :users #relationship with users...
      validate  :unique_apply
      protected

        def unique_apply
          if self.users.index(self.users.last) != self.users.length - 1
            errors.add(:users, "User can't apply multiple times to a workshop") 
          end
        end

И сохранение завершается неудачно, потому что появляется сообщение «Вы не можете подать заявку несколько раз на одну мастерскую». Но пользователь все еще добавлен в мастерскую в качестве участника? Я думаю, что проблема в том, что пользователь уже добавлен в массив до применения сохранения, затем сохранение завершается неудачно, но пользователь не удаляется из массива.

Как я могу исправить эту проблему?

Спасибо!

Marcel

UPDATE Добавил это в миграцию, чтобы в базе данных не было дубликатов, только ruby ​​на рельсах не улавливает ошибку sql, поэтому вылетает ужасно.

    add_index(:users_workshops, [:user_id, :workshop_id], :unique => true)

ОБНОВЛЕНИЕ РЕШЕНИЯ

Исправлена ​​проблема с помощью следующих действий:

Создайте модель соединения вместо отношения has_and_belongs_to_many

Это модель соединения:

    class UserWorkshop < ActiveRecord::Base
      belongs_to :user
      belongs_to :workshop

      validates_uniqueness_of  :user_id, :scope => :workshop_id

    end

Это определение отношения в других моделях:

У пользователя:

      has_many                :workshops,         :through => :user_workshops
      has_many                :user_workshops

В мастерской:

      has_many                :users,     :through => :user_workshops, :uniq => true
      has_many                :user_workshops

Поскольку вы можете выполнить проверку уникальности только в текущей модели, вы не можете проверить уникальность в отношении has_and_belongs_to_many. Теперь у нас есть модель объединения, посредством которой мы объединяем пользователей и семинары, поэтому отношения между пользователем и семинаром остаются прежними, единственное БОЛЬШОЕ отличие состоит в том, что вы можете выполнять проверку в модели объединения. Это именно то, что мы хотим, мы хотим убедиться, что есть только один: user_id per: workshop_id, и поэтому мы используем validates_uniqueness_of: user_id,: scope =>: workshop_id

Дело раскрыто!

P.S. Внимательно следите за тем, чтобы упомянуть сквозное отношение (: user_workshops) как отдельное отношение has_many, в противном случае модель не может найти ассоциацию !!

1 Ответ

0 голосов
/ 18 августа 2011

Согласно "Пути Rails 3", "has_and own_to_man" практически устарел.

Вы должны использовать has_many: through с промежуточной таблицей.

...