Rails验证连接表中某些Id的唯一性?

时间:2016-12-13 22:17:22

标签: ruby-on-rails

我有用户和触发器表,以及一个名为TriggersUser的连接表

是否可以为每个用户定义仅一个触发器ID的范围?例如,每个用户只能拥有trigger_id: 1一次,而trigger_id: 3可以根据需要在连接表中与该用户一起存储多次。

是否可以为触发器ID和用户ID的唯一性定义模型的范围,但仅针对特定的trigger_ids?

谢谢!

2 个答案:

答案 0 :(得分:1)

您必须存储触发器的使用次数。

class AddAllowedUsesToTriggers < ActiveRecord::Migration[5.0]
  def change
    add_column :triggers, :allowed_uses, :integer, default: 1
  end
end

然后添加一个自定义验证,用于检查user_triggers的计数与允许的最大值。

class User
  has_many :triggers, through: :user_triggers
  has_many :user_triggers
end

class Trigger
  has_many :users, through: :user_triggers
  has_many :user_triggers

  def available_to?(user)
    # lets use -1 to represent infinity
    return true if allowed_uses == -1
    # otherwise evaluate if the user has reached the max allowed number
    (allowed_uses - user_triggers.where(user: user).count) > 0
  end
end

class UserTrigger
  belongs_to :user
  belongs_to :trigger

  validates :trigger_available

  def trigger_available
    unless trigger.available_to?(user)
      errors[:trigger] = 'has been expended by user'
    end
  end
end

答案 1 :(得分:0)

为什么不对TriggerUser模型添加验证?

validates :trigger_id, unique: {scope: :user_id}

当然,还需要在这两个字段上添加唯一索引,因为在某些情况下会使用唯一验证will not ensure uniqueness