我有表单,可以批量创建一些对象。对于我的流程,我必须立即保存它们,或者根本不保存。问题是 - 当我进行验证时,它们没有失败,因为每个对象都根据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
我如何实现这一目标?
答案 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