ruby-on-rails - Rails 方法只返回一条记录,返回多条记录时抛出异常

标签 ruby-on-rails activerecord

在 Django 中,ORM 有一个名为 get() 的函数。它用于仅返回模型的单个实例。具体来说,它如果您只期望一个对象返回多个对象,则会引发异常 ,因此它非常适合某些查找(即“查找带有此 slug 的一篇文章”)。

我无法在 Rails/ActiveRecord 中找到具有相同行为的类似函数。到目前为止,我一直在编写如下代码:

Model.where( ... ).first

但这会导致返回一个对象的多个实例的无声错误——这确实是一个糟糕的、模棱两可的情况——我们只是捕获了第一个并继续进行,就像一切正常一样。

Active Record Query Interface guide列出了 5 种检索单个对象的方法,使用 find()find_by()看起来最有希望,但当多个对象匹配搜索条件时,它们都不会引发异常。

我知道我可以写 where()find_by()查询并检查自己返回的对象数量,但是这段代码在我们的代码库中随处可见,我宁愿不添加所有这些杂乱无章的东西。这似乎也是一个通用的、常见的需求,我希望它会被嵌入到 Rails/ActiveRecord 的某个地方。

是否有一些我遗漏的功能可以更容易地捕捉这些情况?如果有帮助,我们将使用 Rails 4 和 Ruby 2.0。

最佳答案

我不知道内置的 Active Record 方法可以满足您的要求,但编写自己的方法并不难。类似的东西:

class YourModel
  def self.find_only_one_by_slug(slug)
    results = YourModel.where(slug: slug)
    if results.size > 1
      raise "There should only be one return value."
    else
      return results.first
    end
  end
end

我还没有测试过上面的代码,所以肯定会有错误,但你明白了。您甚至可以更进一步,向所有模型都可以访问的事件记录库添加类似的方法。

关于ruby-on-rails - Rails 方法只返回一条记录,返回多条记录时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19795062/

相关文章:

javascript - 返回 false 或 e.preventdefault 不起作用

ruby-on-rails - Ruby gems Will_Paginate 样式

ruby-on-rails - RSpec 中是否有与 Cucumber 的 "Scenarios"等效的内容,还是我以错误的方式使用 RSpec?

ruby-on-rails - 如何在 rails 中指定和验证枚举?

ruby-on-rails - 如何在 Rails 中设置时区?

ruby-on-rails - Rspec 测试做了它应该做的事情但显示失败

ruby-on-rails-3 - 多个 has_many :through

mysql - 对于单个Rails应用程序使用两个不同的数据库(MySQL和Postgres)

mysql - 动态 Active Record 查询中的 Codeigniter 括号

javascript - rails : stylesheet path in js file on production