Я запрашиваю существующие записи в таблице с именем messages
; затем этот запрос используется как часть функции «найти или создать»:
fn find_msg_by_uuid<'a>(conn: &PgConnection, msg_uuid: &Uuid) -> Option<Vec<Message>> {
use schema::messages::dsl::*;
use diesel::OptionalExtension;
messages.filter(uuid.eq(msg_uuid))
.limit(1)
.load::<Message>(conn)
.optional().unwrap()
}
Я сделал это необязательным, поскольку и поиск записи, и ее отсутствие являются допустимыми результатами в этом сценарии, поэтому в результате этот запрос может вернуть Vec
с одним Message
или пустым Vec
, поэтому я всегда заканчиваю тем, что проверяю, является ли Vec
пустой или не использующий такой код:
let extant_messages = find_msg_by_uuid(conn, message_uuid);
if !extant_messages.unwrap().is_empty() { ... }
а затем, если он не пуст, принимая первое Message
в Vec
как мое найденное сообщение, используя код вроде
let found_message = find_msg_by_uuid(conn, message_uuid).unwrap()[0];
Я всегда беру первый элемент в Vec
, поскольку записи уникальны, поэтому запрос будет возвращать только 1 или 0 записей.
Это кажется мне запутанным и, кажется, требует слишком много шагов, я чувствую, что если есть запись для запроса, то она должна возвращать Option<Message>
, а не Option<Vec<Message>>
или None
, если нет записи, соответствующей запросу.