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”
答案 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
除非我遗漏了什么,否则这将解决您的问题。