运行rake db:migrate时Ruby未初始化的常量

时间:2013-09-17 02:01:03

标签: ruby-on-rails ruby

uninitialized constant in blah/blah/add_feed_id_to_entry_states.rb:6:in `up'
class AddFeedIdToEntryStates < ActiveRecord::Migration
  def up
    add_column :entry_states, :feed_id, :integer
    add_index :entry_states, :feed_id

    EntryState.find_each do |entry_state| 
      entry_state.feed_id = entry_state.entry.feed_id
      entry_state.save!
    end
  end  

  def down
    remove_column :entry_states, :feed_id
  end
end

有谁能看到第6行出了什么问题?使用ruby 2.0的“EntryState.find_each”

2 个答案:

答案 0 :(得分:2)

这个问题有两个解决方案。要么明确添加

require 'entry_state' 

位于迁移的顶部,或添加虚拟定义(如果EntryState在以后的迁移中发生了很大的变化,那么迁移仍然有效:

class EntryState < ActiveRecord::Base

  has_one :entry

end

答案 1 :(得分:0)

你应该从不尽量不在迁移中包含模型。迁移代码的重点是,一旦它致力于掌握,它就不会改变。

想想如果你彻底改变了你的 EntryState模型会发生什么。您的迁移可能会失败,从头开始创建数据库将是一个巨大的痛苦。这绝对不值得。

相反,您应该将这种数据填充代码放在种子文件中,或者在控制台中运行它。

但是,对于这种特定情况,您是否考虑过使用委托?

class Feed < ActiveRecord::Base
  has_many :entries
  has_many :entry_states, :through => :entries
end

class Entry < ActiveRescord::Base
  belongs_to :feed
  has_many :entry_states
end

class EntryState < ActiveRecord::Base
  belongs_to :entry

  delegate :feed, :to => :entry, :allow_nil => true
end

除非我遗漏了什么,否则这将解决您的问题。