验证少数未保存的对象

时间:2015-06-24 08:07:02

标签: ruby-on-rails ruby validation

我有表单,可以批量创建一些对象。对于我的流程,我必须立即保存它们,或者根本不保存。问题是 - 当我进行验证时,它们没有失败,因为每个对象都根据db中的当前记录进行验证(我有唯一性验证),但我还需要验证每个未保存对象的当前对象。小例子

class User
    #field: email
end

在我的表单对象中,我有一组用户。在循环中我做

@users.each do |user|
  valid_users << user if user.valid?   #and this is where i need to validate `user` within not just DB, but within @users aswell
end

我如何实现这一目标?

4 个答案:

答案 0 :(得分:1)

您可以将它们包装在一个事务中,如果一个失败,它将回滚整个批处理。

begin
  ActiveRecord::Base.transaction do
    @users.map(&:save!)
  end
rescue  ActiveRecord::RecordInvalid
end

答案 1 :(得分:1)

为什么不检查user.valid?验证数据库记录,然后手动检查@users,只有在它不重复的情况下才能保存。

@users.each do |user|

  #the following would check for identical objects in @users, but that may not be what you want
  valid_users << user if user.valid? and @users.count(user)<2

  #this would check only the required field on the array
  valid_users << user if user.valid? and @users.map(&:email).count(user.email)<2

end

答案 2 :(得分:1)

首先需要检查所有未保存的对象是否通过验证测试,如果是,为此,您可以针对唯一字段email

执行此操作
if @users.map { |user| user.email.downcase }.uniq.length == @users.size
  @users.each do |user|
    valid_users << user if user.valid?   
  end
else
  # Error: Emails of the users must be unique
end

希望这有帮助!

答案 3 :(得分:0)

执行此操作的一种方法是使用all?

if @users.all?{|u| u.valid? } # true, only when all users are validated
   # save all users
else
   # redirect/render with error message.
end