私はモデルに属しているcategories
を持っていますが、代わりにstore
に属したいと思います。私は数千もあるので、私がしたいのは、store_id
をカテゴリに追加して、それに関連付けられているproduct.store.id
を現在の関連付けから取得し、store_id
に追加する移行を作成することです。その後、私は製品の関連付けを削除したいと思います。belongs_toアソシエーションを移行するための移行
誰でも簡単に安全に達成する方法を知っていますか?
私はモデルに属しているcategories
を持っていますが、代わりにstore
に属したいと思います。私は数千もあるので、私がしたいのは、store_id
をカテゴリに追加して、それに関連付けられているproduct.store.id
を現在の関連付けから取得し、store_id
に追加する移行を作成することです。その後、私は製品の関連付けを削除したいと思います。belongs_toアソシエーションを移行するための移行
誰でも簡単に安全に達成する方法を知っていますか?
あなたは、あなただけの店などのカテゴリを使用して新しい参照を作成する新しい移行を追加することができますrename_column
を使用し、あなたは失いたくない列のデータを持っています。
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
製品リファレンスとインデックスを追加してからストアと同じように書き込むと、インデックスも削除される可能性があります。
まず、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.
あなたは間違った方向に関連付けを追加する必要があり、あなたは関連付けを逆にする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
が、私はまだ値を変更する必要があります。 product_idが明らかにstore_idと一致しないため –