目前,我正在建立一个系统,用户可以申请到车间.唯一的问题是用户可以多次应用。
这是应用程序的代码
#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而保存失败是因为出现了“您不能为同一车间多次应用”的消息。但是用户仍然作为参与者被添加到车间吗?我认为问题在于,在应用保存之前,用户已经被添加到数组中,然后保存失败,但是用户不会被从数组中删除。
我怎样才能解决这个问题?
谢谢!
马塞尔
UPDATE在迁移中添加了这一点,因此数据库中没有重复,只有rails上的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只有一个:workshop_id,因此我们使用validates_uniqueness_of :user_id :scope =>:workshop_id
案子解决了!
注意,请注意,您将通过关系(:user_workshops)作为一个单独的has_many关系,否则模型找不到关联!!
发布于 2011-08-18 19:47:57
根据“Rails 3 Way","has_and belongs_to_man”实际上已经过时了。
您应该在中间表中使用has_many : table。
https://stackoverflow.com/questions/7112432
复制相似问题