0
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 行有什么问题吗?“EntryState.find_each”使用 ruby​​ 2.0

4

2 回答 2

2

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

require 'entry_state' 

在您的迁移顶部,或添加一个虚拟定义(这样,如果EntryState在以后的迁移中发生很大变化,您的迁移仍然可以工作:

class EntryState < ActiveRecord::Base

  has_one :entry

end
于 2013-09-17T05:11:16.690 回答
0

永远不应该尝试不将模型包含在迁移中。迁移代码的要点是,一旦它提交给 master,它就不会改变。

想想如果你彻底改变你的 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

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

于 2013-09-17T04:50:54.163 回答