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)
但是,这似乎也验证对独特的组合active
是false
(例如,我永远不可能有两个以上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 = true
每company_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)
Rails 4+为此提供了更好的解决方案.
validates_uniqueness_of :company_id, conditions: -> { where(active: true) }
Run Code Online (Sandbox Code Playgroud)
查看文档