2011-03-01 55 views
4

我遷移2個ActiveRecord的連接之間數據刪除屬性,我有我的模型中的所有設置正確,所以我可以從讀說遺產::表名和表名,並將其插入到新表。ActiveRecord的模型

我的問題是我的新機型沒有所有的都在傳統的模式,使我得到一個「未知屬性」的屬性,當我嘗試創建通過新模式的記錄;

legacy_users = Legacy::User.all 
legacy_users.each do |legacy_user| 
    User.create legacy_user.attributes 
end 

但是如果我嘗試刪除有問題的屬性,它也仍然無法正常工作如。

legacy_user.attributes.delete 'some_attribute' 

任何人都可以提供任何指針?

+0

是否必須使用ActiveRecord,或者你可以使用普通的舊SQL呢?將數據從/直接轉儲/加載到數據庫會更快,而不是實例化,驗證和保存ActiveRecord對象。 – Teoulas 2011-03-01 23:47:44

回答

1

這應該在這種情況下工作:

legacy_users = Legacy::User.all 
legacy_users.each do |legacy_user| 
    u = User.new 

    u.attributes.each do |k, v| 
    old_val = legacy_user.send(k) # Get the attr from old user 
    u.send("#{k}=", old_val) # Set it to the new user 
    end 
end 

你不會需要經過太

+0

返回「NameError:方法'some_attribute」不是傳統::用戶」 – 2011-03-01 17:36:19

+0

定義我發佈了一個另類的反應! – nvez 2011-03-01 17:48:31

+0

是的,這很好用 - 它將成爲你的答案和Deepaks的組合,因爲有時屬性不在新模型中,而舊模型中的屬性反之亦然。 – 2011-03-02 09:28:27

11

刪除未使用的每一個屬性的爛攤子如何attributes.except(:some_attribute)?

+0

在軌道4,這應該是:attributes.except( 'some_attribute') – Jonas 2015-07-19 09:26:34

+0

導軌[哈希#除外](http://api.rubyonrails.org/classes/Hash.html#method-i-except)的作品,[屬性](http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods.html#method-i-attributes)返回散列。 – kangkyu 2016-01-28 01:08:01

0

我正在遷移的歡迎,並在我的情況,我路過一個塊first_or_create克隆的對象。我不能讓delete()except()工作,但由於某種原因,這個工程:

scrubbed_obj = my_obj.attributes.reject { |k,v| k == 'the_attribute_you_dont_want' }

new_object.attributes = scrubbed_obj

,然後塊保存精美。只要丟棄這個答案,以防其他人遇到類似問題。