假设我有一个记录列表,如:
transactions = Transaction.all
我有以下示例方法@currency, @geo, @industry
。我想选择符合以下条件的记录:
- 选择字段
currency
等于@currency
的所有交易,除非@currency
为nil,在这种情况下,我们将忽略该条件(currency为nil时表示所有货币) - 选择字段
geo
等于@geo
的所有交易,除非@geo
为空。 - 选择字段
industry
等于@industry
的所有交易,除非@industry
为空。
我尝试了多个#select
,但没有运气的东西:
transactions.select{ |i| (i.currency == @currency) unless @currency.nil? }.
.select{ |i| (i.geo == @geo) unless @geo.nil? }.
.select{ |i| (i.industry == @industry) unless @industry.nil? }
4条答案
按热度按时间fslejnso1#
您的示例的问题是,如果
@currency
是nil
,则unless @currency.nil?
将返回nil
(这是falsey),这与您的意图相反。您应该改用
||
:在这种情况下,如果
@currency
是nil
,则第一个条件将返回true
,并且所有元素将通过select
框到下一个...另一个选择是运行
select
块 only 参数不是nil
.在这种情况下,你需要把这一行分成几个单独的块:u0sqgete2#
这个应该可以了。
或者,如果您对动力学感兴趣:
efzxgjgh3#
尽可能使用AR/SQL而不是Ruby处理:
gkl3eglg4#
在这种情况下,多次使用
select
是多余的。您可以使用&&
和||
逻辑运算符: