Ruby:不区分大小写的数组比较

4

刚刚发现这个比较实际上是区分大小写的...有人知道一个不区分大小写的实现方式吗?

CardReferral.all.map(&:email) - CardSignup.all.map(&:email)
1个回答

9

我不认为有像减法操作符那样的“直接”方式,但如果你不介意将所有结果都转换成小写字母,你可以这样做:

CardReferral.all.map(&:email).map(&:downcase) - CardSignup.all.map(&:email).map(&:downcase)

否则,您将不得不手动使用find_allreject进行比较:
signups = CardSignup.all.map(&:email).map(&:downcase)
referrals = CardReferral.all.map(&:email).reject { |e| signups.include?(e.downcase) }

我建议阅读Ruby标准类型的参考资料可能会帮助你编写像这样的代码。例如,《Programming Ruby 1.9》从第487页开始解释了Enumerable对象的所有方法(find_all在第489页)。请参考该书。

顺便提一下:这个“(&:”到底是什么意思? - Trip
这两个都包含了不必要的迭代。map { |c| c.email.downcase }reject { |c| signups.index(c.email.downcase) } 都可以很好地工作。 - thorncp
@Trip:在谷歌上搜索“ruby ampersand operator”。这是Symbol#to_proc方法。https://dev59.com/9nI-5IYBdhLWcg3wN1lD - Jo Liss
1
@thorncp:我认为两种方式都可以。大部分性能敏感的操作都在数据库中进行,就可读性而言,它们都同样简洁。顺便说一下,reject { |c| signups.index(c.email.downcase) }并不完全做相同的事情,因为它会给你CardReferral对象,而不是字符串。 - Jo Liss
1
signups.include?表达意图比signups.index更好。 - Andrew Grimm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接