2013-12-08 54 views
1

我有這樣一個模型:創建或遞增Mongoid場與軌道4

class Invoice 
    include Mongoid::Document 
    field :local, type: String 
    field :date, type: DateTime 
    field :total, type: Float 
end 

class LogInvoice 
    include Mongoid::Document 
    field :date, type: Date 
    field :local, type: String 
    field :summary, type: Hash 
end 

現場總結是這樣的一個Hash:

summary = {invoices : 0, amount : 0.0} 

對於存儲,我必須每一張發票在LogInvoice.summary [:金額]中創建LogInvoice.summary [:invoices]中的發票總數(發票計數)和金額總額(Sumit of Invoice.total)的那一天的LogInvoice

如果In聲音存在,我必須更新當天的LogInvoice。

我不知道是否因爲LogInvoice.find()返回一個異常,如果它沒有,所以如何更新現有對象LogInvoice或創建它,如果它不?

謝謝

回答

1

如果我理解你的問題,你應該做這樣的事情:

my_invoice_criteria = Invoice.all # or Invoice.where date: the_date_I_want or anything else 
my_invoice_criteria.each do |invoice| 
log_invoice = LogInvoice.find_or_create_by date: invoice.obtain_proper_date 
#Use this for atomic persistence 
log_invoice.inc :"summary.invoices" => 1 
log_invoice.inc :"summary.amount" => invoice.total 
#Use this for standard persistence 
log_invoice.summary[:invoices]+=1 
log_invoice.summary[:amount]+=invoice.total 
log_invoice.save 
end 

編號: Atomic persistence文檔 Standard persistence文檔

+0

它不工作。第一種方式(原子持久性)拋出未定義的方法'total',第二種方式拋出'nil:NilClass'的'undefined method'[]'。我必須先創建一個哈希?但它會自動增加嗎?注意:感謝find_or_create_by解決方案 – jhrs21

+0

準備就緒!我添加了兩個小改動。首先,我添加到我的模型字段中:summary,type:Hash,:default => {}'第二個,我必須以醜陋的方式自動增加,如下所示:'a = a.to_i + 1',因爲我收到**(未定義的方法'+'爲零:NilClass)**。因爲無論如何 – jhrs21

+0

您的默認散列可能是 :default => {:invoices => 0,:amount => 0} 因此您將避免進一步的「未定義的方法__ for nil:NilClass」 –