【问题标题】:Convert Active Record set into an array of hashes将 Active Record 集转换为哈希数组
【发布时间】:2013-06-17 23:51:31
【问题描述】:

我看到了……

How to convert activerecord results into a array of hashes

并且想要创建一种方法,允许我将任何范围或非范围记录集转换为哈希数组。我将此添加到我的模型中:

 def self.to_hash
   to_a.map(&:serializable_hash)
 end

但是,我收到此错误。

NameError: undefined local variable or method `to_a' for #<Class:0x007fb0da2f2708>

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    您正在对一个类而不是该类的实例执行操作。您可以删除 self. 然后在实例上调用它,或者在需要将集合传递给类方法的集合上调用它:

    def self.to_hash(collection)
      collection.to_a.map(&:serializable_hash)
    end
    

    【讨论】:

    • 我认为他不希望在他的类的实例(即一条记录)上执行此操作,而是在结果集上执行。
    • 感谢 Dylan,发布后也得出了这个结论。
    • 您仍然可以使用其他范围/查询。 User.active.to_hash 仍然只会返回活跃用户的哈希值。 all 不会重置范围,但 unscoped 会。 (请记住,这个类方法可以在作用域/关系上调用,它不仅限于像 User.to_hash 这样只在类本身上调用)
    【解决方案2】:

    您可能也需要为此致电all。只有to_a 可以在范围或现有结果集(例如User.active.to_hash)上正常工作,但不能直接在模型上(例如User.to_hash)。使用all.to_a 将适用于这两种情况。

    def self.to_hash
      all.to_a.map(&:serializable_hash)
    end
    

    请注意,all.to_a 有点重复,因为all 已经返回一个数组,但在 Rails 4 中它是必需的。

    【讨论】:

    猜你喜欢
    • 2017-02-23
    • 2019-10-27
    • 2019-05-23
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多