ruby 1行迭代器用if

时间:2014-07-10 09:20:05

标签: ruby-on-rails ruby

我将此代码出现在应用程序中,并且知道必须有一种更有效的方式来编写它。代码查看活动帐户并将特定帐户添加到新阵列。它工作得很好,但我确信这不是最好的方法。

@pending_expirations = []
Subscription.active.each do |subscription|
  if subscription.card_expiration_date.beginning_of_month == Date.today.beginning_of_month 
    @pending_expirations << subscription
  end
end

有人可以提出更好的方法来迭代这些数据吗?

4 个答案:

答案 0 :(得分:2)

做为

Subscription.active.select do |subscription|
   subscription.card_expiration_date.beginning_of_month == Date.today.beginning_of_month
end

阅读此Enumerable#select方法。

举个例子: -

a = [1, 3, 4, 8, 9] 
a.select { |e| e.odd? } # => [1, 3, 9] 

#select方法将每个元素传递给块,然后在设置时执行条件测试。如果条件求值为true,那么它将当前传递的元素放入数组(在所有迭代完成后最终返回),否则不会。

答案 1 :(得分:2)

您可以像这样编写一个行表达式:

@pending_expirations = []
Subscription.active.each do |subscription| 
    @pending_expirations << subscription if subscription.card_expiration_date.beginning_of_month == Date.today.beginning_of_month
end

答案 2 :(得分:1)

Ruby的“最佳实践”是对最小代码的清晰度和可读性。我会重新考虑你提议的实施。您的问题表明您正在寻找一种更有效的方式来编写它 - 为什么不是Subscription模型中的方法?

#Subscription.rb

def pending_expirations
  self.select do |subscription|
    subscription.card_expiration_date.beginning_of_month == Date.today.beginning_of_month
  end
end

然后在您的控制器中,您只需编写以下内容:

@pending_expirations = Subscription.active.pending_expirations

请注意,active未包含在方法中 - 因此您可以直接调用它。这样做的好处是,您可以在pending_expirations的任何子集上调用Subscription

Subscription.all.pending_expirations获取本月到期的所有订阅

Subscription.gold.pending_expirations获取本月即将到期的所有黄金级订阅

......等等

答案 3 :(得分:0)

我最终获得了1行解决方案。阿鲁普把我放在上面

这就是我想出来的

@pending_expirations = Subscription.active.select { |subscription| subscription.card_expiration_date.beginning_of_month == Date.today.beginning_of_month}