2010-09-16 9 views
6

En dos mesas asignan a ActiveRecord con número desconocido de columnas idénticas, por ejemplo .:¿Cómo copiar un registro (activo) entre tablas, parcialmente?

Table A  Table B 
--------- --------- 
    id   id 
    name   name 
    age   email 
    email  is_member 

Cómo puede copiar todos los atributos idénticos de un registro de Table A a un registro de Table B, excepto el id atribuir I (elegantemente)?

Para las tablas de ejemplo anteriores, se deben copiar los campos name y email.

+0

¿Quieres escribir un script que las copias de todos los registros de un sólo esta vez? ¿O es algo que debería ocurrir cada vez que se agrega un nuevo registro a A? – Mischa

+0

¿Qué constituye columnas idénticas? ¿es el mismo nombre y tipo de datos? –

+0

@KandadaBoggu Mismo nombre de columna. El tipo de fecha se puede suponer idéntico si el nombre de la columna es idéntico – ohho

Respuesta

7

Prueba esto:

Get intersección de las columnas entre TableA y TableB

columns = (TableA.column_names & TableB.column_names) - ["id"] 

Ahora iterar a través de las filas TableA y crear las filas TableB.

TableB.create(TableA.all(:select => columns.join(",")).map(&:attributes)) 

Editar: Copiar un registro:

table_a_record = TableA.first(:select => columns.join(","), :conditions => [...]) 
TableB.create(table_a_record.attributes) 
+0

thx. ¿Cuál es el significado de '.map (&: attributes)'? EDIT: encontrado en http://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby – ohho

+0

la respuesta actual copiará todos los registros de 'TableA'. ¿Cómo copiar solo un registro? – ohho

+1

Actualicé mi respuesta, eche un vistazo. –

0

migt considerar el uso de una función de unión en la acitverecord atributos de hash entre las 2 tablas. No es una respuesta completa, pero puede ayudar a

Cuestiones relacionadas