Ho 3 campi nel mio modulo che non sono nel mio database: opening_type, opening_hours, opening_minutes. Voglio aggiornare l'attributo principale "apertura" (nel database) con questi 3 campi.Rails - Aggiungere attributi non nel modello e aggiornare l'attributo del modello
Ho provato molte cose che non funzionano.
realtà ho:
attr_accessor :opening_type, :opening_hours, :opening_minutes
def opening_type=(opening_type)
end
def opening_type
opening_type = opening.split("-")[0] if !opening.blank?
end
def opening_hours=(opening_hours)
end
def opening_hours
opening_hours = opening.split("-")[1] if !opening.blank?
end
def opening_minutes=(opening_minutes)
end
def opening_minutes
opening_minutes = opening.split("-")[2] if !opening.blank?
end
Ho provato ad aggiungere qualcosa di simile:
def opening=(opening)
logger.info "WRITE"
if !opening_type.blank? and !opening_hours.blank? and opening_minutes.blank?
opening = ""
opening << opening_type if !opening_type.blank?
opening << "-"
opening << opening_hours if !opening_hours.blank?
opening << "-"
opening << opening_minutes if !opening_minutes.blank?
end
write_attribute(:opening, opening)
end
def opening
read_attribute(:opening)
end
Ma, i metodi di accesso non vengono chiamati e penso opening_type, opening_hours, opening_minutes erano troppo vuoto se le funzioni di accesso sono stati chiamati ...
Penso di non aver bisogno di una richiamata before_save e dovrei fare questa riscrittura degli accessor.
Note: - Rails 3.0.5, - opening_type,: opening_hours, opening_minutes: potrebbero essere vuota
EDIT: ho aggiornato il mio codice
Nota questa risposta presuppone che si desidera memorizzare solo il campo 'opening' nel database. Un altro approccio sarebbe quello di memorizzare i singoli componenti nel database e creare la stringa combinata dinamicamente su richiesta. A seconda delle tue esigenze, potrebbe anche essere un approccio migliore per te. – Gareth
Ottengo questo database con il campo di apertura. Questo database si sincronizza con un'app per smartphone e non posso modificare la sua struttura per memorizzare i 3 diversi campi. ;-) Il problema con un callback before_validation è che non si gestisce il caso quando si modifica il modulo ... e dove ho bisogno di troncare il campo di apertura in 3 vars ... per il modulo. So che posso farlo manualmente ma ho pensato che ci fosse un approccio migliore per farlo con gli accessor ... –
Tutto vero, ma il tuo suggerimento di sovrascrivere 'opening =' spezzerà un sacco di cose. Inoltre, è un'idea molto abbozzata avere un metodo setter che scarti totalmente il parametro passato. Meglio avere un metodo separato (come il mio 'set_opening') che chiarisce cosa sta facendo. Non * devi * usare before_validation per chiamare quel metodo ma consiglio seriamente che si tratti di un metodo separato – Gareth