在DataMapper中对单个对象进行多次查询

时间:2014-07-02 00:00:51

标签: ruby datamapper

当我尝试运行以下代码时,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的{​​{1}}进行了验证

此外,accessstoken是延迟加载的,因此只有在被要求具体时才应该查询,在将其序列化为json对象时必须进行查询。

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

=> unique

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

1 个答案:

答案 0 :(得分:1)

您的User.first...电话会调用第一个查询。请注意,它所选择的字段是您所要求的字段 - uidname

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

因此,您需要执行自定义序列化以仅为您的用户输出uidname,或者您应该从初始查询中删除字段选择,以便一次性加载所有内容。

<强>更新 要使用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)