3

ここで私が間違っているのか、それとも私のアプローチが間違っているのかはわかりません。

ユーザーを取得したい (列/フィールドを名前、電子メール、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 独自のシリアル化モジュールを使用すると、同じ動作が見られます。

4

1 に答える 1