我有一个投资组合模型,目前正在运行rake任务,以从Yahoo Finance API获取更新的价格数据,更新投资组合的金额并创建一个新的Valuation对象,该对象获取每个投资组合及其值的快照。
投资组合has_many存储代码及其价格的头寸。持仓与移动有很多关联,作为买入/卖出操作,并从投资组合的金额中加/减。
我用来获取更新的价格数据和更新我的投资组合金额的投资组合方法是:
def new_price_data
price_array = []
if !positions.empty?
positions.each do |pos|
price = YAHOO_CLIENT.quotes([pos.ticker], [:last_trade_price]).first
price = price['last_trade_price'].to_f
price = price * pos.quantity
price_array << price
end
else
price_array << 0
end
price_array
end
def calculate_amount
price = self.new_price_data.inject(&:+)
price
end
def update_portfolio_amount
update_attribute(:amount, self.calculate_amount.round(2))
end
在我的rake文件中,我在评估命名空间中有一个update_price任务:
desc "Retrieve real-time price data"
task update_price: :environment do
Portfolio.all.each do |portfolio|
portfolio.update_portfolio_amount
end
end
当我运行任务的主体(Portfolio.all.each ...)时,它会在我的所有Portfolio对象上运行。出于某种原因,当我在我的cron选项卡中安排它时,它不会运行。
every 1.day, :at => '1:55 am' do
rake "valuation:update_price", :environment => 'development'
end
我的另一个rake任务就是在所有投资组合中创建一个新的Valuation对象,并在给定的一天拍摄其值的快照。
我使用rake估值测试了这个:update_price。有消息说
Running via Spring preloader in process 23522
但是当我检查我的投资组合我的rails控制台时,他们还没有更新。我不确定我的错误在哪里?
我已经做了一些挖掘,当Portfolio对象更改其位置(创建新的,买卖股票)时,运行#update_portfolio_amount。如果我再次运行它,该方法返回nil。由于该方法的主体正在运行#update_attribute,我一直在试图找出导致它返回nil的原因。我只找到#update_attributes返回nil但不是单数的源。
什么可能导致#update_attribute中的nil返回值?