Quando tenho uma variedade de IDs, como
ids = [2,3,5]
e eu executo
Comment.find(ids)
tudo funciona bem. Mas quando existe um ID que não existe, recebo uma exceção. Isso ocorre geralmente quando recebo uma lista de IDs que correspondem a algum filtro e, em seguida, faço algo como
current_user.comments.find(ids)
Desta vez, posso ter um ID de comentário válido, que, no entanto, não pertence ao Usuário especificado, portanto não foi encontrado e recebo uma exceção.
Eu tentei find(:all, ids)
, mas ele retorna todos os registros.
A única maneira de fazer isso agora é
current_user.comments.select { |c| ids.include?(c.id) }
Mas isso me parece uma solução super ineficiente.
Existe uma maneira melhor de selecionar o ID na matriz sem obter exceção no registro inexistente?
fonte
Array
vez de umActiveRecord::Relation
, o que limita o que você pode fazer com isso posteriormente.Comment.where(id: [2, 3, 5])
retorna umActiveRecord::Relation
.Atualização: Esta resposta é mais relevante para o Rails 4.x
Faça isso:
O lado mais forte dessa abordagem é que ela retorna um
Relation
objeto ao qual você pode juntar mais.where
cláusulas,.limit
cláusulas etc., o que é muito útil. Ele também permite IDs inexistentes sem gerar exceções.A sintaxe mais recente do Ruby seria:
fonte
where
sintaxe ao comparar com uma matriz. Eu pensei que talvezIN
fosse necessário codificar o SQL com uma instrução, mas isso parece mais limpo e é um substituto fácil para os obsoletosscoped_by_id
.Se você precisar de mais controle (talvez precise indicar o nome da tabela), também poderá fazer o seguinte:
fonte
your_id_array
quando você recuperar os objetos?ORDER BY
não funcionará na minha situação porque o pedido não é baseado em um atributo. No entanto, existe uma maneira de fazer isso via SQL (por isso é rápido) e alguém até criou uma jóia para isso. Confira estas perguntas e respostas: stackoverflow.com/questions/801824/…Agora os métodos .find e .find_by_id estão obsoletos no rails 4. Portanto, podemos usar abaixo:
Funcionará mesmo se alguns dos IDs não existirem. Isso funciona no
Também para excluir IDs
fonte
Para evitar exceções que matam seu aplicativo, você deve capturá-las e tratá-las da maneira que desejar, definindo o comportamento do aplicativo nas situações em que o ID não foi encontrado.
Aqui estão mais informações sobre exceções em ruby.
fonte
Você também pode usá-lo no named_scope se quiser colocar outras condições
por exemplo, inclua outro modelo:
fonte