Когда у меня есть массив идентификаторов, как
ids = [2,3,5]
и я выполняю
Comment.find(ids)
все отлично работает Но когда есть идентификатор, который не существует, я получаю исключение. Обычно это происходит, когда я получаю список идентификаторов, которые соответствуют какому-либо фильтру, а затем я делаю что-то вроде
current_user.comments.find(ids)
На этот раз у меня может быть действительный идентификатор комментария, который, однако, не принадлежит данному пользователю, поэтому он не найден, и я получаю исключение.
Я пытался find(:all, ids)
, но он возвращает все записи.
Единственный способ сделать это сейчас
current_user.comments.select { |c| ids.include?(c.id) }
Но это мне кажется супер неэффективным решением.
Есть ли лучший способ выбрать ID в массиве без исключения для несуществующей записи?
источник
Array
вместоActiveRecord::Relation
, что ограничивает то, что вы можете сделать с ним впоследствии.Comment.where(id: [2, 3, 5])
действительно возвращаетActiveRecord::Relation
.Обновление: этот ответ более актуален для Rails 4.x
Сделай это:
Сильной стороной этого подхода является то, что он возвращает
Relation
объект, к которому вы можете присоединить больше.where
предложений,.limit
предложений и т. Д., Что очень полезно. Это также позволяет использовать несуществующие идентификаторы без исключений.Более новый синтаксис Ruby будет выглядеть так:
источник
where
синтаксиса при сравнении с массивом. Я подумал, что, возможно, придется кодировать SQL с помощьюIN
оператора, но это выглядит чище и является легкой заменой устаревшегоscoped_by_id
.Если вам нужно больше контроля (возможно, вам нужно указать имя таблицы), вы также можете сделать следующее:
источник
your_id_array
возврата объектов?ORDER BY
будет работать в моей ситуации, потому что порядок не основан на атрибуте. Тем не менее, есть способ сделать это через SQL (так что это быстро), и кто-то даже создал драгоценный камень для него. Проверьте это Q & A: stackoverflow.com/questions/801824/…Теперь методы .find и .find_by_id устарели в rails 4. Поэтому вместо этого мы можем использовать ниже:
Это будет работать, даже если некоторые идентификаторы не существуют. Это работает в
Также для исключения идентификаторов
источник
Чтобы избежать исключений, убивающих ваше приложение, вы должны ловить эти исключения и обрабатывать их так, как вы хотите, определяя поведение вашего приложения в тех ситуациях, когда идентификатор не найден.
Вот больше информации об исключениях в ruby.
источник
Вы также можете использовать его в named_scope, если хотите поставить другие условия
Например, включите какую-нибудь другую модель:
источник