2012-02-08 21 views
7

non avere molta fortuna ultimamente con risposte in StackOverflow (penso di essere il re del premio Tumbleweed), ma qui va comunque:Rails aggiornare solo i campi vuoti

Come posso aggiornare solo i campi che sono vuoti quando si utilizza activeRecord? Ho questo codice:

master_info.update_attributes({:originalTitle => slave_info.originalTitle,                   
:starring => slave_info.starring, 
:theatrical => slave_info.theatrical } 

e vorrebbe qualcosa di simile:

master_info.update_attributes({:originalTitle => slave_info.originalTitle, if !master_info.originalTitle.present?                   
:starring => slave_info.starring, if !master_info.starring.present? 
:theatrical => slave_info.theatrical if !master_info.theatrical.present? } 

ho potuto farlo una linea alla volta, ma sto cercando di evitare che:

master_info.update_attributes(:originalTitle => slave_info.originalTitle) if !master_info.originalTitle.present? 

I leggere qualcosa del tipo:

master_info.update_attributes({:originalTitle => slave_info.originalTitle,                   
          :starring => slave_info.starring, 
          :theatrical => slave_info.theatrical }.reject{ |key, value| value.present?}) 

Ma questo non funziona, non aggiorna nulla, nemmeno i campi vuoti.

In effetti, quale sarebbe l'ideale è non dover ripetere i nomi dei campi poiché sono tutti denominati uguali in entrambi i master e slave, ma non posso fare un .each su unRecord attivo. Ma questo è un problema secondario, quello primario sta aggiornando i campi vuoti.

Speriamo questo non ottiene un tumbleweed :)

risposta

0

È possibile ignorare i update_attributes nel modello con qualcosa di simile

def update_attributes(attributes) 
    attributes.each{|attr| attributes.delete(attr) unless read_attribute(attr).empty?} 
    super(attributes) 
end 

non provato questo codice regola quindi può essere necessario.

+1

E nel caso in cui si desideri mantenere il modo originale di aggiornamento, è necessario definire un altro metodo invece di sovraccaricare. – ksol

+0

Mi dispiace, non capisco. Voglio aggiornare gli attributi se sono vuoti sul lato ricevente. Sembra che questo codice rimuova gli attributi vuoti dal campo in arrivo. O sto leggendo male? – kakubei

+0

Mi dispiace, ho cambiato in 'unless read_attribute (attr) .empty?'. –

7

Un po 'più tardi, ma ho pensato di aggiungere come l'ho fatto nel caso qualcuno lo trovasse utile.

Ho usato la funzione nella prima risposta e l'ho modificata in seguito. Come ha detto @ksol nel suo commento, probabilmente vorrai mantenere il metodo originale update_attributes così com'è, quindi ho aggiunto questo al mio modello. Sono sicuro che potrebbe essere incluso a livello globale se lo si desidera per più modelli.

def update_attributes_only_if_blank(attributes) 
    attributes.each { |k,v| attributes.delete(k) unless read_attribute(k).blank? } 
    update_attributes(attributes) 
end 

Questo rimuove qualsiasi attributo dall'hash a meno che non abbia già un valore. Quindi aggiorna gli attributi rimanenti normalmente.

Problemi correlati