2010-09-16 19 views
6

在兩個表映射到ActiveRecord的未知數量的相同列,例如:如何複製表間的(活動)記錄,部分?

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

我怎麼能(優雅的)副本從Table ATable B一個記錄的記錄都是相同的屬性,除了id屬性?

對於上面的示例表格,應該複製nameemail字段。

+0

你想編寫一個腳本,從A只是這一次副本中的所有記錄?或者,這是每次將新記錄添加到A時應該發生的事情? – Mischa 2010-09-16 02:05:13

+0

什麼構成相同的列?它是相同的名稱和數據類型? – 2010-09-16 02:54:37

+0

@KandadaBoggu同名欄。如果列名相同,日期類型可以假定爲相同的 – ohho 2010-09-16 03:07:49

回答

7

試試這個:表A表B和

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

現在迭代之間的列

獲取路口通過TableA的行和創建表B行。

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

編輯:複製一個記錄:

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

thx。 '.map(&:attributes)'的含義是什麼?編輯:發現在http://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby – ohho 2010-09-16 03:43:26

+0

當前答案將複製'TableA'的所有記錄。如何只複製一條記錄? – ohho 2010-09-16 04:22:41

+1

更新了我的答案,看看。 – 2010-09-16 05:09:50

0

Migt考慮在兩個表之間的acitverecord屬性哈希上使用聯合函數。這不是一個完整的答案,但可以幫助