Ruby on rails 验证在字段未调用时调用的唯一性';你没变吗?

Ruby on rails 验证在字段未调用时调用的唯一性';你没变吗?,ruby-on-rails,ruby,validation,Ruby On Rails,Ruby,Validation,是否每次保存对象时都会调用验证:唯一性,即使字段没有更改?这不是性能问题吗 validates :name, :schedule_id, :uniqueness => true 似乎是这样的。那么,在运行验证之前,是否几乎总是需要确保发生了更改?因为要检查唯一性的每个字段都需要数据库命中 这样会更好: validates :name, :schedule_id, :uniqueness => true, :if => "name_changed? || schedule_id

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

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?
要点:试试这个

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

但是lambda并不是必需的,rails验证采用基于脏属性的条件,如我在示例中所示。我正在试图找到问题的根源,默认行为是否观察到字段的更改,或者每次保存都会被调用。默认行为不观察更改。这就是
:if
:除非有条件。这与OP在问题结束时的情况有何不同?这回答了我的问题,而且非常公平。我不介意使用条件,但是否真的有过这样的情况,您希望验证未更改字段的唯一性?也许有一种观点认为验证器检查这个会更加枯燥?你的问题到底是什么?你只是想确认唯一性验证总是在运行吗?是的。如果这个领域没有改变,我是说。如果是这样的话,就不应该有关于UniquenessValidator是否应该固有地知道何时运行验证的争论了。这是一个相当昂贵的,如果字段没有任何变化,则在DB上运行不必要的请求?第二个请求似乎更灵活,在对象没有变化时有助于防止不必要的验证,但就正常验证而言,每次在DB中保存数据时都必须运行这些验证。这一小开销将持续很长时间确保数据始终保持有效和正确的方法…如果您真的关心性能,您可能希望在数据库中使用。谢谢,我们当然使用索引,但我认为在这种情况下,在应用程序层停止验证会更快,因为它根本不必访问数据库