2013-09-17 3 views
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рубин Uninitialized Constant при работе грабли БД: мигрировать

+0

что ваш имя модели и опубликовать ваши маршруты. – Unknown

ответ

2

Существует два решения этой проблемы. Либо явно добавить

require 'entry_state' 

в верхней части миграции, или добавить фиктивное определение (так что ваша миграция все равно будет работать, если EntryState получает изменился в более поздних миграциях:

class EntryState < ActiveRecord::Base 

    has_one :entry 

end 
0

Вы должны Никогда старайтесь не включать модели в миграции. Точка кода миграции заключается в том, что после того, как она была передана мастеру, она не изменяется.

Подумайте, что произойдет, если вы решительно измените свою модель EntryState. Возможно, ваша миграция может потерпеть неудачу, и создание db с нуля будет огромной болью. Это определенно не стоит.

Вместо этого вы должны поместить этот тип данных в пакетный файл или запустить его в консоли.

Но для этой конкретной ситуации вы подумали об использовании делегата?

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 

Если я ничего не пропустил, это решит вашу проблему.

+0

Ну, я не согласен, если вы меняете свою базу данных структурно, и, следовательно, вам нужно сменить данные вместе с ним, оно относится к миграции. – nathanvda

+0

«никогда» не было слишком сильным но, по-моему, вам следует избегать смешивания логики данных-популяции с логикой миграции, когда это возможно. В этой ситуации t здесь, безусловно, лучшие альтернативы. –

+0

Согласен, избегайте этого. Но речь идет не о популяции данных, а о семенах. Но если ваша датамодель меняется, существующие данные также должны быть изменены, чтобы сохранить целостность данных. Для этого и предназначена миграция. – nathanvda

Смежные вопросы