2013-10-14 28 views
3

我不知道我是否有過錯或如果我的方法是錯誤的。如何在限制列/字段時停止DataMapper雙重查詢?

我想獲取一個用戶(限制列/字段只有姓名,電子郵件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從執行額外的查詢?我知道它與它的延遲加載體系結構有關,並且返回JSON中的@user變量假定我想要整個用戶對象。 我特別不希望密碼字段在用戶對象的任何輸出表示中都可見。

使用DM自帶的序列化模塊時可以看到相同的行爲。

回答

2

我認爲你應該使用中間對象進行json渲染。

首先,查詢從數據庫中的用戶:

db_user = User.first(:api_key => request.env["HTTP_API_KEY"], :fields => [:id, :name, :email]) 

然後,創建一個「JSON對象」來操縱該用戶:

@user = { id: db_user.id, name: db_user.name, email: db_user.email } 
+0

我有同樣的想法,但它不是很優雅 - 特別是在創建一個擁有許多資源的API時,如果已經將數據範圍在另一個本地對象中,則需要編寫大量不需要的代碼。 – SeanNieuwoudt