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

问题描述 投票:0回答:2

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

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

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

谢谢!

ruby-on-rails
2个回答
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

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.