Spec-Zone.ru › RethinkDB ruby

Команда ReQL: set_write_hook

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

table.set_write_hook(function | binary | null) → object

Описание

Устанавливает хук записи в таблицу или перезаписывает его, если он уже существует.

Хук записи может быть анонимной функцией со сигнатурой (context: object, old_val: object, new_val: object) -> object или двоичным представлением, полученным из поля function команды get_write_hook. Функция должна быть детерминированной и не может использовать подзапрос или команду r.js.

Первый аргумент, context, представляет собой объект ReQL, содержащий следующие свойства:

  • primary_key: первичный ключ документа, который удаляется, вставляется или изменяется
  • timestamp: объект ReQL time, представляющий текущее время выполнения запроса

Как и при создании функций вторичных индексов с помощью команды index_create, r.now() считается недетерминированным и поэтому не разрешается в контексте хуков записи. Если вам нужно сослаться на текущее отметку времени, следует использовать context['timestamp'].

Всякий раз, когда выполняется операция записи в таблицу (вставка, удаление или изменение документа), функция хука записи вызывается с параметром контекста, старым значением документа (или null при вставке) и новым значением документа (или null при удалении). Затем она возвращает значение, которое фактически должно быть вставлено и/или заменено вместо new_val. Она также может вернуть r.error(...), чтобы прервать запись.

Для простоты функция хука записи разрешается вернуть null только в том случае, если new_val равняется null. Это всего лишь мера предосторожности, чтобы случайно не превратить вставку/обновление в удаление или удаление в обновление.

При успешном выполнении команда set_write_hook возвращает объект следующей формы:

{
  :function => <binary>,
  :query => "setWriteHook(function(_var1, _var2, _var3) { return ...; })" ,
}

Пример: Создайте хук записи, который устанавливает modified_at в текущее время при каждой операции записи.

r.table('comments').set_write_hook { |context, old_val, new_val|
    new_val.merge({
        :modified_at => context['timestamp']
    })
).run(conn)

Пример: Удалите хук записи, связанный с таблицей comments.

r.table('comments').set_write_hook(nil).run(conn)

Пример: Восстановите устаревший хук записи в таблице.

r.table('posts').get_write_hook().do { |write_hook|
    r.table('posts').set_write_hook(write_hook['function'])
}).run(conn)

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

  • get_write_hook

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

Spec-Zone.ru

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