2016-12-06 2 views
1

Я пытаюсь использовать этот шестигранный пакет: https://github.com/meh/amnesiaЭликсир + Амнезия: как читать атрибут?

Вот моя схема:

use Amnesia 
require Logger 
require IEx 
defdatabase Database do 
    deftable User, [{ :id, autoincrement }, :device_identifier, :match_history], type: :ordered_set, indices: [:device_identifier] do 
    @type t :: %User{ id: non_neg_integer, device_identifier: String.t, match_history: List.t } 

    ... 
    end 
end 

и вот где происходит ошибка:

Amnesia.transaction do 
    // IEx.pry 
    queue = User.where(:device_identifier != device_identifier) 
    if queue do 
    Logger.info "dequeuing another user" 
    matched_user = List.first(queue.values) 
    matched_user |> User.delete 
    push socket, "match_found", %{ device_identifier: matched_user.device_identifier } 
    else 
    Logger.info "queuing user" 
    push socket, "queued", %{} 
    end 
end 

Когда я пытаюсь вызвать matched_user.device_identifier, это выходит из строя. Но разве это не атрибут модели? В README в реестре github он вызывает content в модели Message, поэтому почему я не могу сделать то же самое с device_identifier на моей модели пользователя?

Я даже попробовал с id поля:

pry(8)> matched_user.id 
** (UndefinedFunctionError) function Database.User.id/1 is undefined or private. Did you mean one of: 

     * id/0 

Есть ли способ, чтобы выяснить, какие методы моего объект matched_user отвечает?

+0

Вы можете попробовать напечатать значение 'matched_user', прежде чем выполнить' matched_user.id'? – Dogbert

+0

@Dogbert yeh Я получаю это: '{Database.User, 2," 5pyia9cej4 ", nil}' – Edmund

ответ

3

Amnesia по умолчанию возвращает кортеж для каждой подходящей записи вместо соответствующей структуры, например, в вашем случае он возвратил {Database.User, 2, "5pyia9cej4", nil}. Чтобы получить структуры из результатов необработанных запросов, Amnesia обеспечивает удобную функцию Amnesia.Selection.values/1. Следующее изменение должно работать:

Заменить

matched_user = List.first(queue.values) 

с

matched_user = List.first(Amnesia.Selection.values(queue)) 

Вы также можете использовать шаблон соответствия здесь, чтобы сделать код более идиоматических:

[matched_user | _] = Amnesia.Selection.values(queue) 
+0

wow !! как вы это узнали? – Edmund

+0

Знаете ли вы, как я буду «обновлять» существующую запись? Я не могу найти никаких документов по любому из этих ... – Edmund

+0

В тестах я нашел «Amnesia.Selection.values»: https://github.com/meh/amnesia/blob/211d98275c085a9e3049ccb8db8d29f76b3ffbfc/test/amnesia/database_test. EXS # L56. – Dogbert

0

@ Эдмунд о вашем вопросе в комментарии о том, как обновить существующую запись. Не удалось отформатировать код внутри комментария, поэтому я отправил ответ. Просто упал на него. Вот небольшая функция, которая, похоже, делает трюк о том, как обновить запись. Сначала вы должны выбрать записи, которые необходимо обновить. Я совершенно новой для эликсира, но я не думаю, что это не так уж плохо:

def update_value(entity_id) do 
    Amnesia.transaction do 
    entity = Entity.where entity_key == entity_id 
    end 
    |> Amnesia.Selection.values 
    |> Enum.each(fn e -> 
    Amnesia.transaction do 
     %Entity{e | status: :started} |> 
     Entity.write() 
    end 
    end) 
end 
+0

Работает только в том случае, если тип базы данных «установлен». Если база данных является «сумкой», создается новая запись – Macabeus

 Смежные вопросы

  • Нет связанных вопросов^_^