Как вы монгольский запрос с OR в рубине? [Дубликат]

Причина:

Причина, по которой это undefined, заключается в том, что вы выполняете асинхронную операцию. Это означает, что потребуется некоторое время, чтобы закончить метод getEventList (в зависимости от скорости вашей сети).

Итак, посмотрим на http-вызов.

this.es.getEventList()

После вас на самом деле сделать («пожар») ваш запрос http с subscribe, вы будете ждать ответа. Во время ожидания javascript выполнит строки под этим кодом, и если он встретит синхронные назначения / операции, он немедленно их выполнит.

Итак, после подписки на getEventList() и ожидания ответа,

console.log(this.myEvents);

строка будет выполнена немедленно. И значение этого параметра - undefined до того, как ответ поступит с сервера (или во все, что вы его инициализировали в первую очередь).

Это похоже на выполнение:

ngOnInit(){
    setTimeout(()=>{
        this.myEvents = response;
    }, 5000);

    console.log(this.myEvents); //This prints undefined!
}

Решение:

Итак, как мы можем преодолеть эту проблему? Мы будем использовать функцию обратного вызова, которая является методом subscribe. Потому что, когда данные поступают с сервера, они будут внутри subscribe с ответом.

blockquote>

Поэтому изменение кода на:

this.es.getEventList()
    .subscribe((response)=>{
        this.myEvents = response;
        console.log(this.myEvents); //<-- not undefined anymore
    });

будет печатать ответ .. через некоторое время. Что вы должны делать:

В вашем ответе может быть много чего другого, кроме как его регистрация; вы должны делать все эти операции внутри обратного вызова (внутри функции subscribe), когда данные поступают.

Еще одна вещь, которая стоит упомянуть, состоит в том, что если вы исходите из фона Promise, then обратный вызов соответствует subscribe с наблюдаемыми. Что вам не следует делать:

Не следует пытаться изменить операцию async на операцию синхронизации (но не на то, что вы можете). Одной из причин, по которым мы имеем асинхронные операции, является то, что пользователь не должен ждать завершения операции, пока они могут делать другие вещи за этот период времени. Предположим, что одна из ваших операций async длится 3 минуты, если у нас не было асинхронных операций, интерфейс застыл в течение 3 минут.


Рекомендуемое чтение:

Оригинальный кредит на этот ответ: Как вернуть ответ от асинхронного вызова?

Но с выпуском angular2 мы были введены для машинописных и наблюдаемых данных, поэтому этот ответ можно надеяться охватывает основы обработки асинхронного запроса с помощью наблюдаемых.

39
задан Akshat 21 October 2012 в 16:44
поделиться

5 ответов

В Mongoid 5.0 это работает для меня

Username.or({username: @username}.or({email: @email})
39
ответ дан Sergio Tulentsev 22 August 2018 в 19:38
поделиться
42
ответ дан Sergio Tulentsev 5 November 2018 в 16:52
поделиться

Для других, которые попадают на эту страницу, обновленный синтаксис теперь

Username.or({username: @username}, {email: @email})

Пожалуйста, обратитесь к обновленным документам или соответствующим им .

109
ответ дан James Lim 22 August 2018 в 19:38
поделиться
  • 1
    В области видимости вам все равно придется использовать any_of, иначе это вызовет синтаксическую ошибку. – aledalgrande 2 April 2014 в 20:06
  • 2
    Ссылка, размещенная, ничего не говорит о .or и any_of, пожалуйста, обратитесь к здесь , чтобы увидеть подробную документацию и реализацию – silva96 2 June 2016 в 12:47
  • 3
    вы также можете использовать self.or в области (потому что or является ключевым словом в ruby) – Shiyason 12 April 2017 в 20:49

Кроме того, в Mongoid 5.0, если вы все еще хотите использовать метод where, используйте следующий

Username.where('$or' => [ { username: @username }, { email: @email } ])

, это очень полезно, когда вы строите хеш запроса в динамическом и вам нужно сохранить метод where

3
ответ дан Johan Tique 22 August 2018 в 19:38
поделиться

В ответе @ miguel-savignano есть опечатка. По словам Stackoverflow, «очередь редактирования заполнена», поэтому я не отправил изменения.

Правильный синтаксис:

Username.or({username: @username}).or({email: @email})

Более сжатое решение:

Username.or({username: @username}, {email: @email})

Монгольский селектор разрешит:

{"$or"=>[{"username"=>@username}, {"email"=>@email}]}

Я нашел этот вопрос, как я пытался решить для создания «или» запросов.

Если вы хотите совместить строку или любой из массива элементов, вам нужно будет написать запрос Mongoid с помощью селектора Mongo '$ in'.

Например, у вас есть определенное имя пользователя и массив писем. Вы хотели бы вернуть все результаты, по крайней мере, одно из полей соответствует либо имени пользователя, либо одному из писем внутри массива.

@username = "jess"
@emails = ["hi@mail.com", "test@mail.com", "foo@mail.com"]
User.or({username: ""}, {email: {'$in': @emails}})

Монгольский селектор разрешит:

{"$or"=>[{"first_name"=>""}, {"email"=>{:$in=>["hi@mail.com", "test@mail.com", "foo@mail.com"]}}]}
  • Если у вас есть Users с 2 из 3 писем в вашей базе данных, селектор будет верните счет 2.
  • Если у вас есть User с username «jess» и 3 дополнительных Users, каждый из которых имеет одно из заданных сообщений, тогда селектор вернет счетчик 4.
2
ответ дан Laura 22 August 2018 в 19:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: