Как использовать each_serializer с nil в массиве? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть контроллер с кодом, который выглядит примерно так: Идея состоит в том, чтобы взять массив идентификаторов пользователей и вернуть совпадающие объекты пользователей в порядке, в котором были заданы идентификаторы.

def index
  user_ids = params[:user_ids]
  users = User.where(id: user_ids)
  users_by_id = users.inject({}) do |hash, user|
    hash[user.id] = user
    hash
  end
  sorted_users = user_ids.map do |user_id|
    users_by_id[user_id]
  end
  render json: sorted_users, each_serializer: ::UserSerializer
end

Этот код не работает, если пользователь не существует для данного идентификатора пользователя со следующей ошибкой:

NoMethodError - undefined method `each' for nil:NilClass:

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

Например, если клиент запрашивает /users?user_ids[]=1&users_ids[]=2&user_ids[]=3, а записи существуют только для идентификаторов 1 и 2, я хочу, чтобы ответ JSON выглядел примерно так:

[
  {id: 1, name: "Alice"},
  {id: 2, name: "Bob"},
  null
]
...