2010-09-16 19 views
6

In zwei Tabellen Active mit unbekannten Anzahl von identischen Spalten zugeordnet, z.B .:Wie kopiert man einen (aktiven) Datensatz teilweise zwischen Tabellen?

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

Wie kann ich (elegant) kopieren Sie alle identischen Attribute aus einem Datensatz von Table A auf einen Rekordwert von Table B, mit Ausnahme der id zuschreiben? Für die obigen Beispieltabellen sollten name und email Felder kopiert werden.

+0

Haben Sie ein Skript schreiben möchten, dass Kopien, die alle Datensätze von A nur dieses eine Mal? Oder sollte das jedes Mal passieren, wenn ein neuer Rekord zu A hinzugefügt wird? – Mischa

+0

Was sind identische Spalten? ist es der gleiche Name und Datentyp? –

+0

@KandadaBoggu Derselbe Spaltenname. Der Datumstyp kann als identisch angenommen werden, wenn der Spaltenname identisch ist – ohho

Antwort

7

Try this:

Get Kreuzung der Spalten zwischen TableA und TableB

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

nun durch TableA Reihen durchlaufen und die TableB Zeilen erstellen.

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

Edit: Kopieren eines Datensatzes:

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

thx. Was bedeutet '.map (&: attributes)'? BEARBEITEN: gefunden auf http://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby – ohho

+0

die aktuelle Antwort wird alle Datensätze von 'TableA' kopieren. Wie kopiert man nur einen Datensatz? – ohho

+1

Aktualisiert meine Antwort, werfen Sie einen Blick. –

0

In Erwägung ziehen, eine Union-Funktion auf den acitverecord Attribute Hash zwischen den 2 Tabellen zu verwenden. Es ist nicht eine vollständige Antwort, aber helfen kann

Verwandte Themen