ruby - 限制列/字段时如何阻止DataMapper进行双重查询?

标签 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 对数据库进行了额外的查询以获取未包含在: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 自己的序列化模块时可以看到相同的行为。

最佳答案

我认为你应该使用一个中间对象来进行 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 }

关于ruby - 限制列/字段时如何阻止DataMapper进行双重查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19360786/

相关文章:

css - 在 Ruby on Rails 中将图像加载到 View 中时出错

datamapper - 数据映射器模式

ruby - Ruby Datamapper 如何在同一应用程序中使用不同的数据存储

mysql - Ruby 和 Sinatra,无法将散列密码与 BCrypt 进行比较

ruby - DataMapper `Decimal` 属性可以自动舍入到正确的比例吗?

ruby 哈希 : can't convert String into Integer TypeError

mysql - 加载 'mysql2' Active Record 适配器时出错

ruby - Rails 3.0.12 性能测试问题

ruby - 如何告诉 Ruby 的 OpenSSL 库忽略自签名证书错误?

mysql - DataMapper Time 属性转换为 MySQL 中的 DateTime