【问题标题】:Making decisions based on find_or_create基于 find_or_create 做出决策
【发布时间】:2011-04-04 22:17:33
【问题描述】:

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

@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 个文件的相同列表两次,我想避免向用户显示令人讨厌的大量错误列表。我觉得简单地在一个句子中列出错误会比为每个错误显示单独的错误通知更好。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 error-handling


    【解决方案1】:

    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
    

    但是,如果情况允许您添加唯一性验证,我会这样做。

    【讨论】:

      【解决方案2】:

      您可以将validates_uniqueness_of :name 添加到File 吗?那你就可以了

      unless File.create(:name => file, ...)
        failures << file
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-17
        • 1970-01-01
        • 2015-09-30
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 2021-07-13
        • 2021-03-16
        相关资源
        最近更新 更多