我有用户和触发器表,以及一个名为TriggersUser的连接表
是否可以为每个用户定义一个触发器ID的范围?例如,每个用户只能拥有trigger_id: 1
一次,而trigger_id: 3
可以根据需要多次与连接表中的用户一起存储。
是否可以为触发器ID和用户ID的唯一性定义模型的范围,但仅针对特定的trigger_ids?
谢谢!
您必须存储触发器可以使用的次数。
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
为什么不在TriggerUser
模型上添加验证?
validates :trigger_id, unique: {scope: :user_id}
当然,还需要在这两个字段上添加唯一索引,因为在某些情况下rails唯一验证will not ensure uniqueness