Rails 3验证一个值对列的唯一性?

nee*_*zer 15 validation model ruby-on-rails-3

我有一个带有active列的模型,它是一个布尔值.我想验证所有新添加的记录的唯一性company_id,这样我就可以根据需要添加任意数量的记录,company_id只要active设置为false.active每个应该只有一个记录company_id.

我怎么写这个?我已经尝试过了:

validates :company_id, :uniqueness => { :scope => :active }
Run Code Online (Sandbox Code Playgroud)

但是,这似乎也验证对独特的组合activefalse(例如,我永远不可能有两个以上company_id表中的具有相同active的地位,不管是什么active是) -验证上述允许两个记录company_id,一个与active = false和其他的active = true.一旦这两个记录进入,验证就会阻止其他所有记录.

然后我尝试添加这个:

scope :active, where(:active => true)
Run Code Online (Sandbox Code Playgroud)

但这似乎没有改变验证(与上面相同的问题).

我怎么能写这样的验证,这样我可以用相同的添加尽可能多的记录company_id,只要active是假的,只允许一个active = truecompany_id

sma*_*thy 15

无需使用validates_each- 仅当您想要通过同一个块传递多个属性时.只需创建自定义验证:

validate :company_id_when_active

def company_id_when_active
  if active? and CompanyTerm.exists? ["company_id = ? AND active = 1 AND id != ?", company_id, id.to_i]
    errors.add( :company_id, 'already has an active term')
  end
end
Run Code Online (Sandbox Code Playgroud)


raj*_*raj 9

Rails 4+为此提供了更好的解决方案.

  validates_uniqueness_of :company_id, conditions: -> { where(active: true) }
Run Code Online (Sandbox Code Playgroud)

查看文档