2013-03-12 14 views
10

Sto cercando di inserire dati nel mio database usando ActiveRecord.find_or_initialize_by non funziona con 2 colonne

Quando utilizzo pdays = MyModel.new per l'inizializzazione piuttosto che sotto find_or_initialize_by, lo script funziona correttamente. Ma funziona SOLO una volta. Ho bisogno di questo per eseguire ogni giorno per eseguire aggiornamenti. Quando provo a eseguire lo script la seconda volta con pdays = MyModel.new, non viene generato alcun vincolo di chiave duplicato.

Quindi io sto cercando la find_or_initialize_by sotto con 2 argomenti, ma che dà un errore:

undefined method `find_or_initialize_by'

2 colonne insieme rendono il record unico:

vertica_traffic.each do |vdays| 

    pdays = MyModel.find_or_initialize_by([:local_dt], vdays[:community_id]) 

    pdays[:local_date]  = vdays_traffic[:local_d] 
    pdays[:community_id]  = vdays_traffic[:community_id] 
    pdays[:uniquesters]  = vdays_traffic[:uniques] 

    pdays.save 

end 
+0

stai usando le guide 3.2.x? – jvnill

risposta

6

si potrebbe provare:

MyModel.find_or_initialize_by_local_dt_and_comunity_id([:local_dt], vdays[:community_id]) 

in aggiunta ai nomi delle colonne con un _and_

+5

Si prega di notare, se qualcuno vede questa risposta nel 2016 - Che questo metodo è deprecato in Rails 4+. –

9

Se si utilizzano i binari 3.2.1 e versioni successive, il nuovo nome del metodo è first_or_initialize. Viene utilizzato insieme a where. Nel tuo caso, dal momento che si sta chiamando risparmiare, si dovrebbe usare first_or_create, ma se si desidera chiamare manualmente save, basta sostituire il metodo e chiamare salvare dopo

MyModel.where(local_date: vdays_traffic[:local_date], community_id: vdays_traffic[:community_id]).first_or_create do |record| 
    record.uniquesters = vdays_traffic[:uniques] 
end 
5

I read here that in Rails 4, questa è la sintassi corretta:

Progress.find_or_initialize_by(chore_id: chore.id, period: period[chore.frequency], account_id: chore.account_id)