В настоящее время я создаю систему, в которой пользователи могут подавать заявки на семинары ... единственная проблема заключается в том, что пользователь может подавать заявки несколько раз.
Это код для применения
#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, в противном случае модель не может найти ассоциацию !!