2016-06-28 9 views
0

私はモデルに属しているcategoriesを持っていますが、代わりにstoreに属したいと思います。私は数千もあるので、私がしたいのは、store_idをカテゴリに追加して、それに関連付けられているproduct.store.idを現在の関連付けから取得し、store_idに追加する移行を作成することです。その後、私は製品の関連付けを削除したいと思います。belongs_toアソシエーションを移行するための移行

誰でも簡単に安全に達成する方法を知っていますか?

答えて

0

あなたは、あなただけの店などのカテゴリを使用して新しい参照を作成する新しい移行を追加することができますrename_column

+0

が、私はまだ値を変更する必要があります。 product_idが明らかにstore_idと一致しないため –

0

を使用し、あなたは失いたくない列のデータを持っています。

class YourMigrationName < ActiveRecord::Migration 
    def up 
    add_reference :categories, :store, index: true 
    Category.all.each do |category| 
     category.store_id = category.product_id 
     category.save 
    end 
    remove_column :product_id 
    end 

    def down 
    add_reference :categories, :product, index: true 
    Category.all.each do |category| 
     category.product_id = category.store_id 
     category.save 
    end 
    remove_reference :categories, :store, index: true 
    end 
end 

製品リファレンスとインデックスを追加してからストアと同じように書き込むと、インデックスも削除される可能性があります。

0

まず、STORE_IDする列の名前を変更

rename_column :categories, :product_id, :store_id 

はその後assosciationを変更します。

これでデータを転送するためのレーキタスクを作成するか、コンソールから手作業で行うことができます。 レーキタスクを書く方が良い方法です。

お客様の要件に応じて、レーキタスクは、製品から店舗を取得し、要件に応じてカテゴリに割り当てることができます。

require 'rake' 

    namespace :category do 
     task :product_to_store => :environment do 
      Category.all.each do |category| 
       product = Product.find(category.store_id) //you will get product,as now it chnaged to store_id 
       if product.present? 
        category.store_id = product.try(:store).try(:id) //assign the product's store_id to the category, use try to reject errored records 
        category.save 
       end  
      end 
     end 
    end 

Now run, **`rake category:product_to_store`**, thats it, the data gets transfered. 
1

あなたは間違った方向に関連付けを追加する必要があり、あなたは関連付けを逆にするchange_tableを使用することができます。

class CreateFavorites < ActiveRecord::Migration[5.0] 
    def change 
    create_table :favorites do |t| 
     t.belongs_to :article 

     t.timestamps 
    end 
    end 
end 


class RemoveArticleFromFavorites < ActiveRecord::Migration[5.0] 
    def change 
    change_table :favorites do |t| 
     t.remove_references :article 
    end 
    end 
end 

class AddFavoriteToArticles < ActiveRecord::Migration[5.0] 
    def change 
    change_table :article do |t| 
     t.belongs_to :favorite 
    end 
    end 
end 
関連する問題