我正在使用其中一个心理块,我有一段代码,我想在一个方法中保持一个干净的方式。
这就是这个想法;
def self.number_price(user_id,to)
user = User.find(user_id)
user_prices = user.prices
user_prices.each do |price|
if to =~ /^(#{price.prefix})/
return price.send("price_#{user.currency.downcase}").to_f
end
end
end
但是,如果下面这个循环没有返回任何我想要返回的内容;
return DefaultPrices.send("price_#{user_currency.downcase}").to_f
否则,该方法默认返回user_prices = user.prices
有人建议采取一些干净的方式来做这件事。 谢谢
答案 0 :(得分:4)
def self.number_price(user_id, to)
user = User.find(user_id)
price = user.prices.find {|price| to =~ /^(#{price.prefix})/ } || DefaultPrices
price.send("price_#{user.currency.downcase}").to_f
end
答案 1 :(得分:1)
显而易见的是什么问题? (Delta处理未找到的用户。)
def self.number_price(user_id, to)
user = User.find(user_id)
user.prices.each do |price|
return price.send("price_#{user.currency.downcase}").to_f if to =~ /^(#{price.prefix})/
end
DefaultPrices.send("price_#{user_currency.downcase}").to_f
end
答案 2 :(得分:1)
我认为使用Enumerable#find
就是你要找的。我可能会这样做:
def self.number_price(user_id,to)
prices = User.find(user_id).prices
price = prices.find {|p| to =~ /^(#{p.prefix})/} || DefaultPrices
price.send("price_#{user.currency.downcase}").to_f
end
但如果可能的话,我想重构user_id
并传递给用户。这样,这个类不需要知道User的实现方式,只知道它有价格方法。
def self.number_price(user,to)
price = user.prices.find {|p| to =~ /^(#{p.prefix})/} || DefaultPrices
price.send("price_#{user.currency.downcase}").to_f
end
你可以更进一步,但这似乎是处理它的好方法。