【问题标题】:Multiple queries on single object in DataMapperDataMapper中单个对象的多个查询
【发布时间】:2014-07-02 00:00:51
【问题描述】:

当我尝试运行以下代码时,DataMapper 仅在这两行中调用了 3 个查询。谁能解释它为什么会这样做?

 @u = User.first(:uid => 1, :fields => [:uid, :name])
 json @u

这会调用以下查询:

 SELECT "uid", "name" FROM "users" WHERE "uid" = 1 ORDER BY "uid" LIMIT 1
 SELECT "uid", "email"  FROM "users" WHERE "uid" = 1 ORDER BY "uid"
 SELECT "uid", "accesstoken" FROM "users" WHERE "uid" = 1 ORDER BY "uid"

值得注意的是,datamapper 在name 上验证了=> unique

此外,accesstoken 是延迟加载的,因此只有在特别要求时才应查询它,这必须在将其序列化为 json 对象时发生。

编辑: 我添加了我的模型类以进行澄清。我只想对 uid 和 name 进行一次查询,而不必从对象中单独提取它们。也许这是唯一的方法?

 property :uid,    Serial
 property :name,   String
 property :email,  String
 property :accesstoken, Text

回答: 使用内置此支持的 dm-serializer gem https://github.com/datamapper/dm-serializer

【问题讨论】:

    标签: ruby datamapper


    【解决方案1】:

    第一个查询由您的User.first... 调用调用。请注意,它选择的字段是您要求的 - uid 和 name

    第二个和第三个查询在 json 序列化中运行,因为它会延迟加载您尚未加载的每个属性。

    因此,您要么需要进行自定义序列化,只为您的用户输出 uid 和 name,要么您应该从初始查询中删除字段选择,以便立即加载所有字段。

    更新: 要使用 datamapper 进行自定义序列化,您可以使用 dm-serializer gem https://github.com/datamapper/dm-serializer 并调用 @u.to_json(only: [:uid, :name])

    在这个简单的例子中,您可以自己构建您想要的序列化对象,有很多示例:Rails3: Take controll over generated JSON (to_json with datamapper ORM)

    【讨论】:

    • 有没有办法只序列化我运行的User.first 返回的哈希?我只希望返回这两个字段,当我放置哈希时,它只包含这些字段。为什么序列化会触发正在搜索的额外参数?
    • 经过进一步阅读,dm-serializer gem 能够序列化当前的 DM 对象,而无需发送另一个查询!谢谢你的解释!
    猜你喜欢
    • 1970-01-01
    • 2011-06-06
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多