当我尝试运行以下代码时,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
答案 0 :(得分: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)