Rails + Mongoid - 不要在 JSON 中返回 nil 值

2023-12-30

我在 Mongoid 中有很多可选字段,例如:

  field :key, type: String             
  field :element, type: String         
  field :rect, type: Array             

如果我返回此模型的 json,其中仅填充其中一个,我会得到null所有其他字段的值。我怎样才能删除这些字段?

我的模型具有嵌套属性,这意味着空值可以在多个级别上。

澄清:

我需要一种方法从模型的 json 表示中删除空字段,包括所有嵌套属性中的空字段。

代码示例:

1.9.3-p0 :005 > u=Muse.new(:key=>'ram').to_json
 => "{\"_id\":\"4f1ced749c2ee4219d000003\",\"element\":null,\"key\":\"ram\",\"rect\":null}" 

默认情况下mongoid具有删除空字段的能力。如果您让某些字段为空,mongoid将在插入时删除它们。

在下面的示例中,我省略了字段元素和矩形

class User
  include Mongoid::Document

    field :key, type: String             
    field :element, type: String         
    field :rect, type: Array       

    embeds_one :home  
end
>> u=User.new(:key=>'ram').to_json
=> "{"_id":"4f1c3722b356f82e4a000001","_type":"key":"ram"}"

它工作得很好。但是如果你在字段中输入一个零值

>> u=User.new(:key=>'ram',:element=>nil).to_json
=> "{"_id":"4f1c3722b356f82e4a000001","_type":"User","key":"ram","element":null}"

它被插入。我认为这就是您的代码中的确切问题。因此,您可以通过使用转换 JSON 哈希表示来解决此问题as_json并删除 nil 字段

x=u.as_json.reject! {|k,v| v.nil?}
=> "{"_id":"4f1c3722b356f82e4a000001","_type":"User","key":"ram"}"

但要进入内部层次,你不能使用as_json。检查下面的代码

  >>h=Home.new(:address=>'xxxx',:dummy=>nil)
  >>u.home = h 
  >>x=u.as_json.reject! {|k,v| v.nil?}
  =>{"_id"=>BSON::ObjectId('4f1c39b4b356f82e4a000003'), "_type"=>"User","key":"ram","home"=>#<Home _id: 4f1c3c5db356f82e4a000004,address:'xxxx' , dummy: nil >}

现在您可以看到嵌入式文档室内的现场虚拟变量仍然为零。所以我最好的建议是根本不要将 nil 值放入 db 中。为此,请放置一个before_save回调您的模型(也嵌入)并删除空字段。

我还将向您展示如何从嵌套对象中删除空字段。如果没有其他办法就使用它

我们可以用attributes的 mongoid 模型来获取对象的哈希表示,包括嵌套级别

x=u.attributes
=> {"_id"=>BSON::ObjectId4f1c39b4b356f82e4a000003,"key"=>"ram","element"=>nil,"home"=>{"address"=>"xxxx", "_id"=>BSON::ObjectId4f1c3c5db356f82e4a000004,"dummy"=>nil}}

你必须找到 mongoid 对象内是否有哈希值,如果有,我们必须使用reject! {|k,v| v.nil?}也在那个哈希上

把所有的放在一起

def to_json(obj)
     obj.reject! {|k,v| v.nil?}
     obj.find_all {|x| x[1].class==BSON::OrderedHash}.each do |arr| 
           obj[arr[0]] = to_json(arr[1])    
     end
     obj     
end

并用模型的属性来调用它,

 >> to_json u.attributes
 => {"_id"=>BSON::ObjectId4f1c39b4b356f82e4a000003,"key"=>"ram","home"=>{"address"=>"xxxx", "_id"=>BSON::ObjectId4f1c3c5db356f82e4a000004}}

就这样。希望能帮助到你

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails + Mongoid - 不要在 JSON 中返回 nil 值 的相关文章

随机推荐

  • 为什么我被迫在 python 中使用 os.path.expanduser ?

    我确信这是故意的 所以有人可以解释这种行为的理由 Python 2 7 2 default Oct 13 2011 15 27 47 GCC 4 1 2 20080704 Red Hat 4 1 2 44 on linux2 Type he
  • 如何更改 Netbeans 中 JTabbedPane 中选项卡的顺序?

    希望这应该是一个非常简单的问题 在 Netbeans 中 使用 GUI Swing 编辑器 我在 JTabbedPane 中有四个面板 选项卡 4 我想坐在选项卡 1 现在所在的位置 但我最后创建了它 所以默认情况下它位于列表的末尾 如何在
  • 在嵌套 lambda 中捕获通用可调用对象 - 始终向前?

    我的代码库中有各种函数 它们采用通用的可调用对象 并在调用它之前将其传递给一系列嵌套的 lambda 例子 template
  • ODBC v Libpq:PostgreSQL 的 C 库

    我将使用 C 库来连接和使用 PostgreSQL 数据库 我想知道 ODBC 和 Libpq 的优缺点是什么 据我所知 libpq 似乎更快 但我无法得到任何明确的答案或基准 另外 是否有任何其他库可能比 ODBC Libpq 更好 如果
  • GNU gdb 无法进入模板函数 (OS X Mavericks)

    我已经安装了gdb 7 7 来自 GNU 来源 在 OS X Mavericks 10 9 2 下 我对其进行了代码签名 因此每当我调试时它都可以正常工作c 不包含模板的文件 但是 它无法单步执行模板函数 可以单步执行常规函数 但无法单步执
  • Bootstrap 网格中列行的垂直对齐

    假设您有一个使用 Twitter Bootstrap 的两列布局 您希望其中特定的行彼此垂直对齐 div class container div class row div class col sm 6 h2 Column 1 h2 p O
  • 将一列类似 GeoJSON 的字符串转换为 GeoPandas 中的几何对象

    我在 GeoPandas 数据框中有一列 其中包含这样的字符串 type Point coordinates 37 55 55 71 或这个 type MultiPoint coordinates 37 6 55 4 它也可以是多边形或任何
  • iOS - 使用自定义加密密钥保护文件?

    昨天我发布了有关保护文件的问题 保护应用程序沙箱 https stackoverflow com questions 4595955 protecting the app sandbox 如前所述 如果用户在 iPad 上有密码 这似乎可以
  • jQuery:获取标题和 href 值作为变量

    我有一个带有标题和 href 值的链接列表 我希望能够单独获取这些值 但我总是获取第一个链接的值 这是为什么 在这里看我的小提琴 http jsfiddle net FaNdV 正如您所看到的 单击任何链接时 您始终会从第一个链接获取值 我
  • 带有自定义图像的 UISwitch

    我需要通过更改背景颜色以及旋钮 支架 图像来自定义 UISwitch 如下图所示 是否可以在不拒绝应用程序的情况下自定义 UISwitch 提前致谢 有一个onTintColor您可以在 UISwitch 上设置的属性 如果您还需要更改手柄
  • 根据布尔列升序或降序

    This is the table structure in PostgreSQL 10 尽管 日期 是一个int 它代表 yyyy mm dd 日期 我正在尝试写一个SELECT按日期排序 当 BC true 时desc 因此日期将按正确
  • Flutter:使用不包含 Bloc 类型的上下文调用 blocprovider.of()

    我是 flutter 新手 我想使用 BLoc 实现一个简单的登录屏幕 没有构建错误 但在运行时收到以下错误 使用不包含 LoginBloc 类型的 Bloc 的上下文调用 blocprovider of My Code class Log
  • Julia 中的字典帮助 - 从文本文件创建字典

    我正在尝试根据 Julia 中文本文件的内容创建一个库 以用于生物信息学问题 该文件的格式如下 UUU F CUU L AUU I GUU V UUC F CUC L AUC I GUC V 我想制作一本字典 其中键是 3 个字母部分 密码
  • 在表单之间传递数据

    我的项目中有 3 个 winform Form3 上有一个复选框 我想要做的是单击此复选框 然后在退出表单时对 Form1 中的复选框进行相同的检查 无论是否选中 我现有的代码如下 但它不起作用 我是否在某个地方错过了一个技巧 谢谢 For
  • Nat 列表在 0 到 2 之间的类?

    使用 Peter Neyens 的帮助answer https stackoverflow com a 39159167 409976 我尝试创建一个X类仅包含Nat小于或等于2 import shapeless import shapel
  • MongoDB 与 Mongoose 限制子文档

    对于 MongoDB 和 Mongoose 我是个菜鸟 所以请原谅我 我将 Node 与 Express 以及 Mongoose 一起使用 我有一个包含大量子文档的文档 以至于我的服务器在尝试加载所有子文档时内存不足 所以我想选择子文档的最
  • 无法解决排序规则冲突?

    我遇到了这个错误 但我不知道如何修复它 无法解决 Arabic CI AS 和 Arabic CI AS 之间的排序规则冲突 等于操作中的 SQL Latin1 General CP1 CI AS 注意 我已经从数据库选项更改了排序规则 g
  • mvc3 验证检查属性值是否不同

    在 MVC3 中 您可以向模型添加验证以检查属性是否匹配 如下所示 public string NewPassword get set Compare NewPassword ErrorMessage The new password an
  • Pytest 从不同的测试用例文件中排序

    您好 我使用 pytest 并在文件夹中有以下 2 个 py 文件 test abc py如下 class MyTest unittest TestCase classmethod def setup class cls cls a 10
  • Rails + Mongoid - 不要在 JSON 中返回 nil 值

    我在 Mongoid 中有很多可选字段 例如 field key type String field element type String field rect type Array 如果我返回此模型的 json 其中仅填充其中一个 我会