【问题标题】:has_and_belongs_to_many validation such that users can't apply multiple times to a workshophas_and_belongs_to_many 验证,这样用户不能多次申请研讨会
【发布时间】: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


【解决方案1】:

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

你应该使用 has_many :through 和一个中间表。

【讨论】:

  • 我想我会这样做,因为这似乎几乎是不可能的
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2013-01-24
  • 2015-09-28
  • 2014-11-29
  • 2011-11-24
  • 1970-01-01
  • 2016-10-29
相关资源
最近更新 更多