一部のデータを移動するために移行を楽しもうとしています。以前の移行では、次を実行します。
add_column :portfolios, :owner_id, :integer
次に、移行は次のようになります。 class MoveUserIdToPortfolio < ActiveRecord::Migration
class Stake < ActiveRecord::Base
end
class UserStakeInPortfolio < Stake
belongs_to :portfolio, foreign_key: :possession_id
def self.sti_name
'UserStakeInPortfolio'
end
end
class User < ActiveRecord::Base
has_many :user_stake_in_portfolios, foreign_key: :owner_id
has_many :portfolios, through: :user_stake_in_portfolios
has_many :personal_portfolios, through: :user_stake_in_portfolios, :class_name => 'PersonalPortfolio', :source => :portfolio, :conditions => { :type => 'PersonalPortfolio' }
def personal_portfolio
self.personal_portfolios.first
end
end
class Portfolio < ActiveRecord::Base
end
class PersonalPortfolio < Portfolio
def self.sti_name
'PersonalPortfolio'
end
end
def up
puts "DEBUG: #{Portfolio.inspect}"
Portfolio.connection.schema_cache.clear!
Portfolio.reset_column_information
PersonalPortfolio.connection.schema_cache.clear!
PersonalPortfolio.reset_column_information
User.connection.schema_cache.clear!
User.reset_column_information
puts "DEBUG2: #{Portfolio.inspect}"
User.all.each do |user|
pp = user.personal_portfolio
puts "DEBUG3: #{pp.inspect}"
pp.owner_id = user.id
pp.save
puts "DEBUG4: #{pp.inspect}"
end
end
def down
end
end
ここで奇妙なのは、pp.owner_id が設定されていないことです。また、(次の) 出力では、エラーは発生しませんが、owner_id を更新しようとしていることが示されません。
(0.1ms) BEGIN
(0.3ms) UPDATE `portfolios` SET `updated_at` = '2013-09-11 22:16:06' WHERE `portfolios`.`type` IN ('PersonalPortfolio') AND `portfolios`.`id` = 4
(0.4ms) COMMIT
DEBUG
ステートメントは、属性のPortfolio
ないを示しています。owner_id
しかし、DEBUG2
それは1つで出力されます。しかし、2 つのpp.inspect
出力はどちらも のインスタンスを示していませんowner_id
。
役立つ情報があれば、喜んで提供します。