Как я могу получить активную запись, чтобы выдать исключение, если есть слишком много записей - PullRequest
0 голосов
/ 18 апреля 2019

По принципу fail-fast :

При запросе к базе данных, где должна быть только одна запись, я хочу исключение, если .first() ( first ) встречает более одной записи.

Я вижу, что есть метод first! , который выдает, если записей меньше, чем ожидалось, но я ничего не вижу, если есть две или более.

Как я могу получить активную запись для сбоя рано, если записей больше, чем ожидалось?

Есть ли причина, по которой активная запись не работает таким образом?

Я привык к C # Single () , который будет выдавать, если найдены две записи.

Ответы [ 3 ]

2 голосов
/ 18 апреля 2019

Почему вы ожидаете сбой метода first activerecord, если существует более 1 записи? нет смысла так работать.

Вы можете определить свой собственный метод класса для подсчета записей до получения первого. Что-то вроде

def self.first_and_only!
  raise "more than 1" if size > 1
  first!
end

Это вызовет ошибку, если их больше 1, а также если вообще нет записи. Если есть один и только один, он вернет его.

2 голосов
/ 18 апреля 2019

Кажется, у ActiveRecord нет таких методов. Один полезный метод, который я нашел, это one? , вы можете вызвать его для объекта ActiveRecord::Relation. Вы могли бы сделать

users = User.where(name: "foo")
raise StandardError unless users.one?

и, возможно, определите свое собственное исключение

1 голос
/ 18 апреля 2019

Если вас достаточно волнует производительность запросов, вам следует избегать ActiveRecord::Relation count, one?, none?, many?, any? и т. Д., Которые порождают запрос SQL select count(*) ....

Итак, вы можете использовать SQL limit, например:

def self.single!
  # Only one fast DB query
  result = limit(2).to_a
  # Array#many? not ActiveRecord::Calculations one
  raise TooManySomthError if result.many?
  # Array#first not ActiveRecord::FinderMethods one
  result.first
end

Также, когда вы ожидаете получить только одну запись, вы должны использовать Relation take вместо first. Последний предназначен для действительно первой записи и может выдавать бесполезный SQL ORDER BY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...