2011-05-06 15 views
10

Ho un modello per una delle mie tabelle di database. Voglio sovrascrivere il nome della colonna per quella particolare tabella. Come potrei realizzarlo.Come sovrascrivere una colonna nel modello Rails?

Per esempio, che il mio tavolo essere chiamato manichino e ha una colonna chiamata col_a

col_a 
20 
34 
42 
23 
12 

avrei fatto un @dummy.col_a. Ora questo metodo dovrebbe restituirmi 0 per i numeri che terminano con 0 e per tutto il resto, dovrebbe restituire il valore originale. Potrei farlo definendo un nuovo metodo, ma voglio sovrascrivere il nome della colonna stessa. Per favore aiuto.

risposta

22

è possibile ignorare il metodo col_a. Utilizzare il metodo read_attribute per leggere il valore nel database. Qualcosa del genere:

def col_a 
    if self.read_attribute(:col_a).to_s.end_with?('0') 
    0 
    else 
    self.read_attribute(:col_a) 
    end 
end 
9

È possibile definire semplicemente un metodo con lo stesso nome della colonna. Per ottenere il valore effettivo della colonna, utilizzare self [nome_colonna]. Quindi, qualcosa come questo dovrebbe funzionare:

class Dummy < ActiveModel::Base 
    def col_a 
    self[:col_a] % 10 == 0 ? 0 : self[:col_a] 
    end 
end 

(ciò presuppone col_a è un numero intero.)

+0

che dovrebbe essere 'self [: col_a]!% 10 = 0? self [: col_a]: 0' o '(self [: col_a]% 10) .zero? ? 0: self [: col_a] ' – fl00r

+0

Yup - ho assunto 0 sarebbe valutato come falso qui, ma non è così. Fisso. – Thilo

4

È possibile ottenere che overwriting default accessors come descritto nella documentazione. Tutti i valori delle colonne sono automaticamente disponibili tramite gli accessor di base sull'oggetto Active Record, ma a volte si desidera specializzare questo comportamento. Questo può essere fatto sovrascrivendo i metodi di accesso di default (utilizzando lo stesso nome dell'attributo) e chiamando read_attribute(attr_name) e write_attribute(attr_name, value) di cambiare realmente le cose.

Scorrere fino a Sovrascrivere le opzioni di accesso predefinite per ulteriori informazioni.

0

Sono un po 'in ritardo alla festa qui, ma un modo molto elegante per farlo è usare semplicemente super

class Dummy < ApplicationRecord 
    def col_a 
    super % 10 === 0 ? 0 : super 
    end 
end 
Problemi correlati