2012-11-05 108 views
0

即使字段没有改变,每次保存对象时validates :uniqueness会被调用吗?这不是性能问题吗?验证字段没有改变时调用唯一性?

validates :name, :schedule_id, :uniqueness => true 

它似乎是这样的情况。因此,在运行验证之前,确保进行更改几乎总是有必要的吗?由于检查每个字段的唯一性需要数据库命中。

这会更好:

validates :name, :schedule_id, :uniqueness => true, :if => "name_changed? || schedule_id_changed?" 

而这更好的,如果有点冗长:

validates :name, :uniqueness => true, :if => :name_changed? 
validates :schedule_id, :uniqueness => true, :if => schedule_id_changed? 

要点在这里:https://gist.github.com/4017019

+2

你的问题到底是什么?重刑?你只是在寻找唯一性验证始终运行的确认吗? –

+0

是的。如果这个领域没有改变,我的意思是。如果是这样,就不应该争论UniquenessValidator是否应该固有知道何时运行验证。如果字段没有改变,那么在数据库上运行一个相当昂贵,不必要的请求? –

+0

第二个看起来更加灵活,并且在对象没有改变时帮助防止不必要的验证,但就正常的验证而言,每次将数据保存在数据库中时都必须运行它,这一小部分开销将会运行确保数据始终保持有效和正确的很长的一段路... –

回答

0

试试这个

validates :name, :uniqueness => true, :if => lambda {self.name_changed? } 
+0

虽然lambda不是必须的,如我在示例中所示,rails验证采用基于脏属性的条件。我试图找到问题的根源,默认行为是观察字段的更改还是每次保存都会被调用。 –

+1

默认行为没有观察到更改。这就是':if'和':除非'条件适用。 – deefour

+1

这与OP在问题结束时有什么不同? –