我将此代码出现在应用程序中,并且知道必须有一种更有效的方式来编写它。代码查看活动帐户并将特定帐户添加到新阵列。它工作得很好,但我确信这不是最好的方法。
@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
有人可以提出更好的方法来迭代这些数据吗?
答案 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}