【问题标题】:Extract `Moped::BSON::Document` attributes in Ruby hash在 Ruby 哈希中提取 `Moped::BSON::Document` 属性
【发布时间】:2013-02-21 15:39:58
【问题描述】:

在 Mongoid 3.0.21 中,如何将所有模型的属性作为普通的 Ruby Hash

调用#attributes#raw_attributes 将返回Moped::BSON::Document。虽然它实际上扩展了Hash,但 几个散列方法不能按预期工作。特别是#except 返回未经修改的self,而不是在去掉给定键的情况下散列

更新Moped::BSON::Document 正确继承了Hash 的行为。我试图用符号而不是字符串来命名属性,这就是#except 不起作用的原因。很快:做except('pictures'),而不是except(:pictures)

【问题讨论】:

    标签: ruby-on-rails ruby mongoid


    【解决方案1】:
    Hash[e.attributes]
    

    其中 e 是您的模型实例

    【讨论】:

    • 谢谢!我知道一定有一些像这样优雅的解决方案!
    • 您可能希望使用 ActiveSupport::HashWithIndifferentAccess 而不是普通的 Hash,以便能够同时使用字符串和符号访问值
    • 我当然可以,谢谢。但主要问题是我根本无法访问属性名称,因为它们是用字符串而不是符号索引的。这与我习惯的(ActiveRecord)不同。
    【解决方案2】:

    我很抱歉碰到这么旧的东西,但我想把这个留给我自己和所有未来遇到同样问题的人。我正在使用 Mongoid ORM for Rails,它在内部使用 Moped 与 MongoDB 交互。

    现在,这个 gem 为我节省了手动将内容转换为 HashHashWithIndifferentAccess: https://github.com/mindscratch/mongoid-indifferent-access 的时间。

    基本上它似乎有某种预返回钩子,可以自动将来自 MongoDB 的所有文档转换为类型 HashWithIndifferentAccess

    没有在这方面寻找积分。只是想把它留在这里,因为它是该问题的最佳 Google 结果,它使我免于发疯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2011-04-14
      • 2019-11-21
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      相关资源
      最近更新 更多