Несколько запросов к одному объекту в DataMapper

Когда я пытаюсь запустить следующий код, DataMapper вызывает 3 запроса только в этих двух строках. Может ли кто-нибудь объяснить, почему это будет делать это?

 @u = User.first(:uid => 1, :fields => [:uid, :name])
 json @u

Это вызывает следующие запросы:

 SELECT "uid", "name" FROM "users" WHERE "uid" = 1 ORDER BY "uid" LIMIT 1
 SELECT "uid", "email"  FROM "users" WHERE "uid" = 1 ORDER BY "uid"
 SELECT "uid", "accesstoken" FROM "users" WHERE "uid" = 1 ORDER BY "uid"

Стоит отметить, что datamapper имеет валидацию name на предмет того, что он => unique.

Кроме того, токен доступа загружается лениво, поэтому его следует запрашивать только при специальном запросе, что должно происходить при сериализации его в объект json.

РЕДАКТИРОВАТЬ: я добавил свой класс модели для уточнения. Я просто хочу сделать один запрос для uid и имени без необходимости извлекать их по отдельности из объекта. Может быть, это единственный способ?

 property :uid,    Serial
 property :name,   String
 property :email,  String
 property :accesstoken, Text

ОТВЕТ: Используйте гем dm-serializer со встроенной поддержкой https://github.com/datamapper/dm-serializer


person 12preschph    schedule 02.07.2014    source источник


Ответы (1)


Первый запрос вызывается вашим вызовом User.first.... Обратите внимание, что выбранные поля — это то, что вы просили — uid и name.

Второй и третий запросы выполняются в сериализации json, так как ленивая загрузка каждого свойства, которое вы еще не загрузили.

Таким образом, вам либо нужно выполнить пользовательскую сериализацию, чтобы выводить только uid и name для ваших пользователей, либо вам следует просто удалить выбор поля из исходного запроса, чтобы все загружалось сразу.

Обновление. Чтобы выполнить пользовательскую сериализацию с помощью datamapper, вы можете использовать гем dm-serializer https://github.com/datamapper/dm-serializer и вызовите @u.to_json(only: [:uid, :name])

В качестве альтернативы в этом простом случае вы можете просто создать сериализованный объект, который вам нужен, для чего есть много примеров: Rails3: взять под контроль сгенерированный JSON (to_json с ORM преобразователя данных)

person agmin    schedule 02.07.2014
comment
Есть ли способ сериализовать только возвращенный хэш из User.first, который я запускаю? Я хочу вернуть только эти два поля, и когда я добавляю хэш, он содержит только эти поля. Почему сериализация запускает поиск дополнительных параметров? - person 12preschph; 02.07.2014
comment
После дальнейшего чтения гем dm-serializer может сериализовать текущий объект DM без отправки другого запроса! Спасибо за объяснение! - person 12preschph; 02.07.2014