我发出如下查询,可以准确检索 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/