限制列/字段时如何从双查询中停止DataMapper?

时间:2013-10-14 12:58:29

标签: ruby datamapper ruby-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对数据库进行了额外的查询以获取{{1}中未包含的字段来自日志的约束:

:fields

我的问题是:如何阻止DM执行其他查询?我知道它与它的延迟加载架构有关,并且在JSON中返回SELECT "id", "password", "api_key", "premium", "timezone", "verified", "notify_me", "company", "updated_at" FROM "users" WHERE "id" = 1 ORDER BY "id" 变量假定我想要整个用户对象。 我特别不希望密码字段在用户对象的任何输出表示中可见。

使用DM自己的序列化模块时可以看到相同的行为。

1 个答案:

答案 0 :(得分: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 }