首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >has_and_belongs_to_many验证,这样用户就不能多次应用于车间

has_and_belongs_to_many验证,这样用户就不能多次应用于车间
EN

Stack Overflow用户
提问于 2011-08-18 18:41:06
回答 1查看 1.4K关注 0票数 4

目前,我正在建立一个系统,用户可以申请到车间.唯一的问题是用户可以多次应用。

这是应用程序的代码

代码语言:javascript
复制
      #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

讲习班模型进行了以下验证:

代码语言:javascript
复制
      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错误,所以它会崩溃。

代码语言:javascript
复制
    add_index(:users_workshops, [:user_id, :workshop_id], :unique => true)

更新解决方案

通过执行以下操作解决了问题:

创建一个连接模型而不是一个has_and_belongs_to_many关系

这是连接模型:

代码语言:javascript
复制
    class UserWorkshop < ActiveRecord::Base
      belongs_to :user
      belongs_to :workshop

      validates_uniqueness_of  :user_id, :scope => :workshop_id

    end

这是其他模型中的关系定义:

在用户中:

代码语言:javascript
复制
      has_many                :workshops,         :through => :user_workshops
      has_many                :user_workshops

在讲习班中:

代码语言:javascript
复制
      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关系,否则模型找不到关联!!

EN

回答 1

Stack Overflow用户

发布于 2011-08-18 19:47:57

根据“Rails 3 Way","has_and belongs_to_man”实际上已经过时了。

您应该在中间表中使用has_many : table。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7112432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档