我正在尝试做这样的事情(一次创建多个文件):

@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/

10-11 20:44