【发布时间】:2011-10-30 01:23:31
【问题描述】:
目前我正在构建一个用户可以申请研讨会的系统......唯一的问题是用户可以多次申请。
这是申请代码
#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
Workshop 模型进行以下验证:
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
并且保存失败,因为出现了“您不能多次申请同一个研讨会”的消息。 但是用户仍然作为与会者添加到研讨会? 我认为问题是在应用保存之前用户已经添加到数组中,然后保存失败但用户没有从数组中删除。
我该如何解决这个问题?
谢谢!
马塞尔
更新 在迁移中添加了这个,所以数据库中没有重复,只有 ruby on rails 没有捕获 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 关系的唯一性。现在我们有一个加入模型,我们通过该模型加入用户和工作室,因此用户和工作室中的关系保持不变,唯一的大区别是您可以在加入模型中进行验证。这正是我们想要的,我们想验证每个 :workshop_id 只有一个 :user_id,因此我们使用 validates_uniqueness_of :user_id, :scope => :workshop_id
案件解决了!
附:请注意,您将直通关系 (:user_workshops) 作为单独的 has_many 关系提及,否则模型无法找到关联!!
【问题讨论】:
-
我用PP添加了一些调试信息,第一个是我添加一个用户之前的用户数量。第二个是添加了一个用户,第三个是保存失败。这是响应“当前用户”3“添加了一个用户”4“保存失败”4。所以添加的用户留在数组中?
标签: ruby-on-rails validation model relationship