有条件地验证Rails中布尔值的唯一性

Jav*_*mae 4 activerecord ruby-on-rails-4 rails-activerecord

我试图验证布尔字段的唯一性,但只有当它是真的时.我的模型中定义了以下内容:

validates_uniqueness_of :org_feed, if: :org_feed
Run Code Online (Sandbox Code Playgroud)

运行此验证时,它会生成以下SQL:

SELECT 1 AS one FROM `feeds` WHERE `feeds`.`org_feed` = BINARY 't' LIMIT 1
Run Code Online (Sandbox Code Playgroud)

但是,此查询在找到布尔值org_feed所在的Feed时会返回一行0,这与它应该执行的操作完全相反.我希望BINARY 't'只是true因为该字段是一个布尔值.因此,我觉得查询应该是这样的:

SELECT 1 AS one FROM `feeds` WHERE `feeds`.`org_feed` = true LIMIT 1
Run Code Online (Sandbox Code Playgroud)

我是否需要以某种方式告诉验证这是一个布尔字段?

win*_*yer 6

您可以在模型中使用以下代码:

validates :org_feed, uniqueness: true, if: :org_feed_is_true?

def org_feed_is_true?
  org_feed == true
end
Run Code Online (Sandbox Code Playgroud)

请查看http://guides.rubyonrails.org/active_record_validations.html#using-a-symbol-with-if-and-unless,了解有关此内容的更多信息.

  • 为什么不更简单:验证:org_feed,唯一性:true,如果:: org_feed不需要方法. (4认同)