формы, например.
с Diesel, я застрял, написав функцию, которая принимает векторString
s в качестве входных данных и выполняет следующие действия:
String
с большим запросомвыполнить запрос наConnection
обработать результатвернутьVec
Если я создаю запрос за один шаг, он работает просто отлично:
fn get_books(authors: Vec<String>, connection: SqliteConnection) {
use schema::ebook::dsl::*;
let inner = author
.like(format!("%{}%", authors[0]))
.and(author.like(format!("%{}%", authors[1])))
.and(author.like(format!("%{}%", authors[2])));
ebook
.filter(inner)
.load::<Ebook>(&connection)
.expect("Error loading ebook");
}
Если я попытаюсь сгенерировать запрос несколькими шагами (необходим для работы с переменной длиной входного вектора), я не смогу его скомпилировать:
fn get_books(authors: Vec<String>, connection: SqliteConnection) {
use schema::ebook::dsl::*;
let mut inner = author
.like(format!("%{}%", authors[0]))
.and(author.like(format!("%{}%", authors[1]))); // <1>
inner = inner.and(author.like(format!("%{}%", authors[2]))); // <2>
ebook
.filter(inner)
.load::<Ebook>(&connection)
.expect("Error loading ebook");
}
Это приводит к следующей ошибке:
inner = inner.and(author.like(format!("%{}%",authors[2])));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `diesel::expression::operators::Like`, found struct `diesel::expression::operators::And`
Я не понимаю, почему Руст ожидаетLike
и неAnd
, Функция и линия помечены<1>
возвращаетAnd
и, следовательно,And
хранится вinner
.
Чего мне не хватает? Почему первый фрагмент кода компилируется, а второй нет? Как правильно создать такой запрос?