我有一个方法可以返回单个对象或对象集合。 我希望能够在该方法的结果上运行object.collect,无论它是否是单个对象或集合。 我怎样才能做到这一点?

profiles = ProfileResource.search(params)
output = profiles.collect do | profile |
    profile.to_hash
end

如果配置文件是单个对象,当我尝试在该对象上执行collect时,我会收到NoMethodError异常。

===============>>#1 票数:6 已采纳

小心使用展平方法,如果search()返回嵌套数组,则可能会导致意外行为。

profiles = ProfileResource.search(params)
profiles = [profiles] if !profiles.respond_to?(:collect)
output = profiles.collect do |profile|
    profile.to_hash
end

===============>>#2 票数:6

这是一个班轮:

[*ProfileResource.search(params)].collect { |profile| profile.to_hash }

诀窍是splat(*)将单个元素和枚举变为参数列表(在本例中为新数组运算符)

===============>>#3 票数:1

profiles = [ProfileResource.search(params)].flatten
output = profiles.collect do |profile|
    profile.to_hash
end

===============>>#4 票数:0

另一种方法是认识到Enumerable要求您提供每个方法。

所以。 你可以将Enumerable混合到你的班级中并给它一个假的每个都有效....

class YourClass
  include Enumerable

  ... really important and earth shattering stuff ...

  def each
    yield(self) if block_given?
  end
end

这样,如果您从搜索中单独返回单个项目,则可枚举方法仍将按预期工作。

这种方式的优点是,它的所有支持都在你的类中,而不是在必须多次重复的地方之外。

当然,更好的方法是更改​​搜索的实现,使其返回一个数组而不管返回多少项。

===============>>#5 票数:0

ProfileResource类的search方法中,始终返回一组对象(通常是一个Array),即使它只包含一个对象。

===============>>#6 票数:0

如果集合是数组,则可以使用此技术

profiles = [*ProfileResource.search(params)]
output = profiles.collect do | profile |
    profile.to_hash
end

这样可以保证您的配置文件始终是一个数组。

===============>>#7 票数:0

profiles = ProfileResource.search(params)
output = Array(profiles).collect do |profile|
    profile.to_hash
end

===============>>#8 票数:0

您可以首先使用“pofiles.respond_to?”检查对象是否响应“collect”方法。

来自编程Ruby

obj.respond_to?(aSymbol,includePriv = false) - > true或false

如果obj响应给定方法,则返回true。 仅当可选的第二个参数的计算结果为true时,才会在搜索中包含私有方法。

===============>>#9 票数:0

您也可以使用Kernel#Array方法。

profiles = Array(ProfileResource.search(params))
output = profiles.collect do | profile |
    profile.to_hash
end

  ask by Kyle Boon translate from so

未解决问题?本站智能推荐:

2回复

Ruby库函数将Enumerable转换为Hash

考虑Enumerable的这个扩展: 它是这样使用的: 是否有内置功能已经这样做,或者足够接近它不需要这个扩展?
3回复

如何将UTF8组合字符转换为ruby中的单个UTF8字符?

一些字符,如Unicode字符'LATIN SMALL LETTER C WITH CARON'可以编码为0xC4 0x8D ,但也可以用'LATIN SMALL LETTER C'和'COMBINING CARON'的两个代码点表示,即0x63 0xcc 0x8c 。 更多信息: http
1回复

Ruby Enumerable中的辅助块

我找不到所谓的名称以了解有关其工作原理和工作原理的更多信息,但是我们发现您可以执行以下操作: 我想每当返回零时这都是一个失败的障碍,但是也许有人可以阐明它的工作原理?
1回复

Ruby-MCollective:如何将命令的输出转换为Ruby变量(或对象)

我希望有人可以帮我解决这个问题,我在编写红宝石脚本时遇到了问题。 首先是大图: 当我从cli运行命令时: 我得到以下输出: 我想要的是将命令的输出重定向/获取到某些变量/对象中。 具体来说,我想从摘要中获取“失败的资源”部分或“失败的”值。 任何想法怎么做?
1回复

如何将Ruby对象从文件转换为JSON? [重复]

这个问题已经在这里有答案 : 5年前关闭。 如何将Ruby对象转换为JSON (3个答案) 我正在尝试使用Linguist gem: https : /
5回复

如何将ruby哈希对象转换为JSON?

如何将ruby哈希对象转换为JSON? 所以我在下面尝试这个例子,它不起作用? 我在看RubyDoc,显然Hash对象没有to_json方法。 但是我在博客上读到Rails支持active_record.to_json ,还支持hash#to_json 。 我可以理解ActiveRe
3回复

如何将Ruby对象转换为JSON

我想做这样的事情: 可能吗?
3回复

在Ruby中反转可枚举

我试图在不使用reverse方法的情况下反转Enumerable(如Array),但使用reverse_each迭代器。 我希望,以下代码就足够了: 但是块不会以反向方式返回数组。 我当然可以写 但我想以第一种方式收集物品。 如果这种行为是什么来源,我应该如何编写表达式
3回复

将哈希数组转换为Ruby中的单个哈希

我正在尝试将哈希数组转换为具有键的哈希作为数组中哈希的元素之一。 例如: a = [{"active_accounts": 3, "id": 5}, {"active_accounts": 6, "id": 1} 我想将此数组转换为 我尝试通过遍历数组并访问特定键的各个散列来
2回复

如何将ruby哈希数组转换为单个哈希?

如果我从这样的哈希数组开始: 如何将其转换为此单个哈希: 有没有比做某种for循环更快的方法?