2010-09-16 1 views
6

In due tabelle mappati ActiveRecord con numero imprecisato di colonne identiche, es .:Come copiare un record (attivo) tra le tabelle, parzialmente?

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

Come posso (elegantemente) copiare tutti gli attributi identici da un record di Table A a un record di Table B, tranne il id attributo?

Per le tabelle di esempio sopra, i campi name e email devono essere copiati.

+0

Vuoi scrivere uno script che copia i tutti i record da un solo questa volta? O è qualcosa che dovrebbe accadere ogni volta che un nuovo record viene aggiunto ad A? – Mischa

+0

Cosa costituisce colonne identiche? è lo stesso nome e tipo di dati? –

+0

@KandadaBoggu Nome colonna uguale. Il tipo di data può essere assunto identico se il nome della colonna è identico – ohho

risposta

7

Prova questa:

Get intersezione delle colonne tra TableA e TableB

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

Ora scorrere le righe TableA e creare le righe TableB.

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

Edit: Copiare un record:

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

thx. qual è il significato di '.map (&: attributes)'? EDIT: trovato su http://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby – ohho

+0

la risposta corrente copierà tutti i record da 'TableA'. Come copiare solo un record? – ohho

+1

Aggiornato la mia risposta, dai un'occhiata. –

0

Migt considera l'utilizzo di una funzione di unione sugli attributi hash di acitverecord tra le 2 tabelle. Non è una risposta completa, ma può aiutare a