Spec-Zone.ru › RethinkDB ruby

Команда ReQL: do

Синтаксис команды

any.do(function) → any
r.do([args]*, function) → any
any.do(expr) → any
r.do([args]*, expr) → any

Описание

Вызов анонимной функции с использованием значений возврата других команд или запросов ReQL в качестве аргументов.

Последним аргументом к do (или, в некоторых формах, единственным аргументом) является выражение или анонимная функция, которая получает значения из предыдущих аргументов или из команд, объединенных перед do. Команда do по существу является одноэлементной map, позволяющей применить функцию к одному документу. Это позволяет связать результат запроса с локальной переменной в области действия do, позволяя вычислить результат только один раз и повторно использовать его в сложном выражении или в серии команд ReQL.

Аргументы, передаваемые функции do , должны быть базовыми типами данных и не могут быть потоками или выборками. (Подробнее о типах данных ReQL.) Хотя все аргументы будут оценены до выполнения функции, они могут быть оценены в любом порядке, поэтому их значения не должны зависеть друг от друга. Тип результата do — это тип значения, возвращаемого функцией или последним выражением.

Пример: Вычисление нетто-результата гольфиста в игре.

r.table('players').get('f19b5f16-ef14-468f-bd48-e194761df255').do { |player|
    player['gross_score'] - player['course_handicap']
}.run(conn)

Пример: Возврат лучшего игрока в гольф-матче для двух игроков.

r.do(r.table('players').get(id1), r.table('players').get(id2)) { |player1, player2|
    r.branch(player1['gross_score'].lt(player2['gross_score']), player1, player2)
}.run(conn)

Обратите внимание, что branch, команда условного выполнения ReQL, должна использоваться вместо if. См. branch документацию для получения дополнительной информации.

Пример: Выполнение различных действий в зависимости от результата команды ReQL insert.

new_data = {
    :id => 100,
    :name => 'Agatha',
    :gross_score => 57,
    :course_handicap => 4
}
r.table('players').insert(new_data).do{ |doc|
    r.branch(doc['inserted'].ne(0),
        r.table('log').insert({:time => r.now(), :response => doc, :result => 'ok'}),
        r.table('log').insert({:time => r.now(), :response => doc, :result => 'error'})
    )
}.run(conn)

Связанные команды

  • map

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/ruby/do/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API