2011-05-06 13 views
10

Tengo un modelo para una de las tablas de mi base de datos. Quiero anular el nombre de la columna para esa tabla en particular. ¿Cómo lo lograría?¿Cómo anular una columna en el modelo de Rails?

Por ejemplo, vamos a mi mesa se llama DUMMY y tiene una columna llamada col_a

col_a 
20 
34 
42 
23 
12 

que estaría haciendo un @dummy.col_a. Ahora este método debería devolverme 0 para los números que terminan en 0 y para todo lo demás, debería devolver el valor original. Podría hacerlo definiendo un nuevo método, pero quiero anular el nombre de la columna en sí. Por favor ayuda.

Respuesta

22

Puede anular el método col_a. Use el método read_attribute para leer el valor en la base de datos. Algo como esto:

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

Simplemente puede definir un método del mismo nombre que la columna. Para obtener el valor real de la columna, use self [column_name]. Así que algo como esto debería funcionar:

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

(esto supone col_a es un número entero.)

+0

que debe ser 'auto [: col_a]! = 0% 10? self [: col_a]: 0' o '(self [: col_a]% 10) .zero? ? 0: self [: col_a] ' – fl00r

+0

Yup - Supuse que 0 evaluaría como falso aquí, pero no es así. Fijo. – Thilo

4

se puede lograr que al overwriting default accessors como se describe en la documentación. Todos los valores de columna están disponibles automáticamente a través de los accesos básicos en el objeto Active Record, pero a veces desea especializar este comportamiento. Esto se puede hacer sobrescribiendo los accesadores predeterminados (usando el mismo nombre que el atributo) y llamando al read_attribute(attr_name) y al write_attribute(attr_name, value) para cambiar realmente las cosas.

Desplácese al Sobrescritura de accesos predeterminados sección para obtener más información.

0

Estoy un poco tarde a la fiesta aquí, pero de una manera muy elegante de hacer es simplemente usar super

class Dummy < ApplicationRecord 
    def col_a 
    super % 10 === 0 ? 0 : super 
    end 
end 
Cuestiones relacionadas