ここで私が間違っているのか、それとも私のアプローチが間違っているのかはわかりません。
ユーザーを取得したい (列/フィールドを名前、電子メール、ID のみに制限する):
@user = User.first(:api_key => request.env["HTTP_API_KEY"], :fields => [:id, :name, :email])
コマンド ラインの出力は次のとおりです。
SELECT "id", "name", "email" FROM "users" WHERE "api_key" = '90e20c4838ba3e1772ace705c2f51d4146656cc5' ORDER BY "id" LIMIT 1
上記のクエリの直後に、次のコードがあります。
render_json({
:success => true,
:code => 200,
:user => @user
})
render_json()
このように見えますが、特別なことは何もありません:
def render_json(p)
status p[:code] if p.has_key?(:code)
p.to_json
end
この時点での問題は、@user
変数に完全なユーザー オブジェクト (他のすべてのフィールドが含まれる) が含まれており、DataMapper がデータベースに対して追加のクエリを実行して、:fields
制約に含まれていないフィールドをログから取得していることです。
SELECT "id", "password", "api_key", "premium", "timezone", "verified", "notify_me", "company", "updated_at" FROM "users" WHERE "id" = 1 ORDER BY "id"
私の質問はこれです:DMが追加のクエリを実行するのを止めるにはどうすればよいですか? 私はそれが遅延読み込みアーキテクチャに関係していることを知ってい@user
ます.JSONで変数を返すことは、ユーザーオブジェクト全体が必要であると想定しています. 特に、ユーザー オブジェクトの出力表現でパスワード フィールドが表示されることは望ましくありません。
DM 独自のシリアル化モジュールを使用すると、同じ動作が見られます。