迁移以更改belongs_to关联

时间:2016-06-28 11:47:11

标签: ruby-on-rails

我有一个名为categories的模型,目前它们属于product,但我希望它们属于store。我有几千个,所以我要做的是创建一个迁移,为类别添加store_id,然后从它的当前关联中获取关联的product.store.id将其添加到store_id。之后,我想删除产品协会。

有人知道如何轻松安全地实现这一目标吗?

4 个答案:

答案 0 :(得分:2)

如果您在错误的方向添加关联,可以使用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

答案 1 :(得分:0)

您希望丢失的列中包含数据,然后使用rename_column

答案 2 :(得分:0)

您只需添加新的迁移即可创建包含类别的新引用作为商店。

import { CurrentTimeService  } from "./CurrentTimeService"

如果你已经添加了产品引用和索引,那么可以将其写为与商店相同的内容,这样它也会删除索引。

答案 3 :(得分:0)

首先将列重命名为store_id,

rename_column :categories, :product_id, :store_id

然后改变assosciation。

现在您可以编写rake任务来传输数据,也可以通过控制台手动执行。 这是编写rake任务的更好方法。

根据您的要求,您的佣金任务可以是,从产品中获取商店并根据您的要求分配到类别。

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.