我正在尝试做这样的事情(一次创建多个文件):
@files = params[:files].split(/\s*,\s*/) # comma-separated list is received
failures = []
@files.each do |file|
unless File.find_or_create_by_name(:name => file, ...)
failures << file
end
end
if failures.present?
errors.add(:base, "The following files are already in use: #{failures.to_sentence}
end
上面的不是很有效。当文件是“找到”而不是“创建”时,这应该提示错误(即,因为文件不是新文件)。但是,此处仍未将其添加到失败中(在这种情况下,
find_or_create
绝不会失败)。我该如何优雅地做到上述几点?
注意:例如,如果用户错误地尝试两次创建相同的100个文件列表,则我想避免给用户显示令人讨厌的错误列表。我觉得简单地在句子中列出错误会比显示每个错误通知更好。
最佳答案
find_or_create_by_name将始终返回找到或创建的记录,除非由于验证或其他原因而失败。
如果添加validates_uniqueness_of:name对您不起作用,请考虑以下事项:
if File.find_by_name file
failures << file
else
unless File.create(:name => file, ...)
failures << file
end
end
但是,如果情况允许您添加唯一性验证,我会同意的。
关于ruby-on-rails - 根据find_or_create做出决策,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5544970/