Версия Ruby, которую вы используете (2.4.1), не совместима с версией Rails, которую вы используете (3.2.22.5). Эта версия Ruby требует как минимум Rails 5. Попробуйте понизить версию до Ruby 2.3 или ниже. Вы можете использовать менеджер версий Ruby (то есть rvm
, rbenv
или chruby
), чтобы контролировать, какой Ruby используется при запуске вашего приложения.
Только что заметил, что вы уже используете rbenv
из вашей трассировки стека. Добавьте файл .ruby-version
в каталог вашего приложения, содержащий следующую строку:
2.3.4
После повторного входа в этот каталог подтвердите версию с помощью:
[111]gt; ruby -v
ruby 2.3.4p301 (2017-03-30 revision 58214) [x86_64-darwin16]
(или аналогичной версии ) до запуска рельсов.
Лучший вариант зависит от ваших требований. Вот несколько решений (я предполагаю, что вы используете Python, поскольку вы не указали):
Существуют и другие подходы, но эти три должны охватывать наиболее распространенные случаи.
Если вам нужны транзакции, и вы заботитесь только о получении прямых потомков сущности (не всех потомков), используйте подход, описанный выше, но вместо ListProperty просто используйте ReferenceProperty для родительской сущности. Это известно как список смежности.Существуют и другие подходы, но эти три должны охватывать наиболее распространенные случаи.
Если вам нужны транзакции, и вы заботитесь только о получении прямых потомков сущности (не всех потомков), используйте подход, описанный выше, но вместо ListProperty просто используйте ReferenceProperty для родительской сущности. Это известно как список смежности.Существуют и другие подходы, но эти три должны охватывать наиболее распространенные случаи.
Что ж, вам следует постараться сохранить ваши данные как можно более линейными. Если вам нужно быстро запросить древовидную структуру данных, вам придется либо сохранить ее в базе данных (или в кодировке JSON, если вы предпочитаете), если это возможно для ваших данных, либо вам придется сгенерировать индексы дерева, которые могут использоваться для быстрого запроса части древовидной структуры. Однако я не уверен, как будет работать Google App Engine при обновлении этих индексов.
Когда дело доходит до Google App Engine, ваша основная задача должна заключаться в том, чтобы уменьшить количество запросов, которые вам нужно сделать, и чтобы ваши запросы возвращали как можно меньше строк. Операции стоят дорого, но хранение - нет, поэтому избыточность не следует рассматривать как плохую вещь.
Вот некоторые мысли по этому поводу, которые я обнаружил при поиске в Google (хотя для MySQL, но вы можете получить общую идею из этого): Управление иерархическими данными в MySQL
А, и вот обсуждение Google App Engine: Моделирование иерархических данных
Один из способов - использовать родительский атрибут модели. Затем вы можете использовать функции query.ancestor () и model.parent ().
Я полагаю, это зависит от того, какие операции вы хотите выполнять с этими данными, что определит, как их лучше всего представить.