2014-08-29 78 views
2

我的模型(Bar)已經有一個參考列,我們把它稱爲foo_id,現在我需要將foo_id更改爲fooable_id並使其成爲多態。如何將參考列更改爲多態?

我想我有兩個選擇:?

  • 創建新的參考列fooable這是多態和foo_id遷移的ID(什麼是遷移這些最好的辦法難道我只是做Bar.each { |b| b.fooable_id = b.foo_id }?
  • 重命名foo_idfooable_id並添加polymorphicfooable_id如何polymorpic添加到現有的列?
+0

哦,哇,你還在使用Rails 2?這是真的還是錯字? – 2014-08-29 08:26:42

回答

9

1.變化foo_idfooable_id通過在遷移重命名它像名稱:

rename_column :bars, :foo_id, :fooable_id 

2.並且通過在遷移加入所需foo_type列添加多態性它:

add_column :bars, :fooable_type, :string 

和模型:

class Bar < ActiveRecord::Base 
    belongs_to :fooable, 
    polymorphic: true 
end 

4.最後種子您已經關聯型喜歡的類型:

Bar.update_all(fooable_type: 'Foo') 

Define polymorphic ActiveRecord model association!

+1

最後一步可以重寫爲Bar.update_all(fooable_type:'Foo')',對吧? – 2015-04-21 11:08:25

+0

當然。這是方式mroe可讀.. :)我會編輯。 – 2016-03-23 06:53:46

0

關於你的問題而言,這裏就是我想要做的:

您的Bar模型中的所有數據將根據Bar模型進行存儲。這意味着如果您更改模型中的foo_id屬性,則只需填充需要添加的bar_type屬性(因爲它們都可以引用相同的模型)

要實現的方法這是如下:

  1. 創建遷移foo_id>fooable_id
  2. 通過所有現有的記錄插入fooable_type
  3. 在軌控制檯,環0,第一填充fooable_type

第一件事:

$軌摹遷移ChangeFooID

#db/migrate/latest.rb 
class Latest 
    def change 
     rename_column :bars, :foo_id, :fooable_id 
     add_column :bars, :fooable_type, :string, after: :id 
    end 
end 

這將創建不同的列給你的。然後你只需要能夠循環通過記錄&改變type柱:

軌道ç

Bar.find_each do |bar| 
    bar.update(barable_type: "Foo") 
end 

這將允許您更改列的類型,給你將所有當前記錄與相應記錄相關聯的能力。


多態性

您就可以use the Rails docs as a reference爲如何將模型相關聯:

#app/models/foo.rb 
class Foo < ActiveRecord::Base 
    has_many :bars, as: :barable 
end 

#app/models/bar.rb 
class Bar < ActiveRecord::Base 
    belongs_to :foo, polymorphic: true 
end 

enter image description here

+0

** bar.update(barable_type:「Foo」)**不起作用,因爲更新是私人的。我想你的意思是ActiveRecord#update_attribute。 – 2014-08-31 17:35:12

2

一個小的變化我會做是對遷移:

#db/migrate/latest.rb 
class Latest 
    def change 
    rename_column :bars, :foo_id, :fooable_id 
    add_column :bars, :fooable_type, :string, after: :id, default: 'Foo' 
    end 
end 

這將消除進行數據遷移的需要。

更新:這將工作在軌道3及以上。根據這個問題,原始基類暗示爲Foo。

+0

嗯,這在Rails 2.3中是無效的,這也消除了使用無類型基類的可能性 – deiga 2014-11-17 04:19:45