我发出如下查询,可以准确检索 0 或 1 条记录:

car = Car.where(vin: '1234567890abcdefg')

返回的当然是长度为 1 的汽车列表。所以我最终在查询的末尾添加了 .first:
car = Car.where(vin: '1234567890abcdefg').first

似乎在 Rails 中应该有更好的方法。是否存在像 .onlyOne 这样的东西,它只会返回一个 Car 并在超过 1 个时抛出异常?
car = Car.where(vin: '1234567890abcdefg').onlyOne

或者
car = Car.onlyOne(vin: '1234567890abcdefg')

最佳答案

rails 4

您需要 find_by(vin: 123) ,并且您可以向 find_by 传递要查找的任何字段/值名称的哈希值。

例如。

Car.find_by(vin: '123')

如果没有找到具有该 vin 的汽车,或匹配该 vin 值的单个汽车,则将返回 nil。如果您添加 bang(即 find_by! ),如果没有找到带有该 vin 的汽车,它将引发异常。

如果您想在发现多个错误的情况下引发错误,那您必须自己编写。如果您永远不应该遇到不止一辆汽车具有相同 vin 的情况,那么最好的方法是对汽车模型进行唯一性验证,例如。
class Car < ActiveRecord::Base
  validates_uniqueness_of :vin # or validates :vin, unique: true
end

rails 3

您需要 find_by_vin (并且您可以将 vin 替换为您的任何属性的名称。

例如。
Car.find_by_vin('123')

如果没有找到具有该 vin 的汽车,或者具有该 vin 值的单个汽车,这将返回 nil。如果您添加 bang(即 find_by_vin! ),如果没有找到带有该 vin 的汽车,它将引发异常。

更多信息:http://guides.rubyonrails.org/active_record_querying.html#retrieving-objects-from-the-database

关于ruby-on-rails - 从 ActiveRecord/Rails 查询中检索单个记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22629261/

10-13 01:26