kid*_*rew 32 ruby-on-rails validates-uniqueness-of
我有一个问题类:
class Question < ActiveRecord::Base
attr_accessible :user_id, :created_on
validates_uniqueness_of :created_on, :scope => :user_id
end
Run Code Online (Sandbox Code Playgroud)
给定用户每天只能创建一个问题,因此我希望通过唯一索引强制数据库中的唯一性,并通过validates_uniqueness_of强制使用Question类.
我遇到的麻烦是我只想要非管理员用户的约束.因此,管理员可以根据需要每天创建尽可能多的问题.如何实现优雅的任何想法?
Jon*_*Jon 80
您可以通过将要执行的简单Ruby字符串,Proc或方法名称作为符号作为值传递给验证选项:if
或:unless
在验证选项中进行验证.这里有些例子:
在Rails 5.2版之前,你可以传递一个字符串:
# using a string:
validates :name, uniqueness: true, if: 'name.present?'
Run Code Online (Sandbox Code Playgroud)
从5.2开始,不再支持字符串,为您提供以下选项:
# using a Proc:
validates :email, presence: true, if: Proc.new { |user| user.approved? }
# using a Lambda (a type of proc ... and a good replacement for deprecated strings):
validates :email, presence: true, if: -> { name.present? }
# using a symbol to call a method:
validates :address, presence: true, if: :some_complex_condition
def some_complex_condition
true # do your checking and return true or false
end
Run Code Online (Sandbox Code Playgroud)
在你的情况下,你可以做这样的事情:
class Question < ActiveRecord::Base
attr_accessible :user_id, :created_on
validates_uniqueness_of :created_on, :scope => :user_id, unless: Proc.new { |question| question.user.is_admin? }
end
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请查看rails指南中的条件验证部分:http://edgeguides.rubyonrails.org/active_record_validations.html#conditional-validation
我知道保证唯一性的唯一方法是通过数据库(例如唯一索引)。所有基于Rails的方法都涉及竞争条件。考虑到您的限制,我认为最简单的方法是建立一个单独的,唯一索引的列,其中包含您要留给null
管理员的日期和用户ID的组合。
至于validates_uniqueness_of
,您可以通过使用if
或unless
选项将验证限制为非管理员,如http://apidock.com/rails/ActiveRecord/Validations/ClassMethods/validates_uniqueness_of中所述
归档时间: |
|
查看次数: |
34112 次 |
最近记录: |