2016-07-21 3 views
0

Я новичок в рельсах и после учебника, где мы создали некоторые записи. В настоящее время, когда я запускаю сервер он говорит мнеДублируемое имя столбца в рельсах

Migrations are pending. To resolve this issue, run: bin/rake db:migrate RAILS_ENV=development 

Потом я заметил, увидев некоторые SO постов, я должен сделать что-то вроде бега

rake db:migrate 

Тогда я понял, что, когда я сделал, что я получил кучу линии и один, у которого было это

ActiveRecord::StatementInvalid: SQLite3::SQLException: duplicate column name: description: ALTER TABLE "articles" ADD "description" text 

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

rails console- > Article.all 

Я получаю

<ActiveRecord::Relation [#<Article id: 1, title: "This is my first article", 

description: "This is the description", created_at: "2016-07-20 00:03:42", 

updated_at: "2016-07-20 00:03:42">, #<Article id: 2, title: "This is an endited 

title", description: "This is my second description", created_at: "2016-07-20 

00:05:39", updated_at: "2016-07-20 00:40:54">] 

Что я создал вчера. Но где это дублирующее поле описания? Где я должен искать?

Мои две миграционные файлы выглядят как это, кстати

class CreateArticles < ActiveRecord::Migration 
    def change 
    create_table :articles do |t| 
     t.string :title 
     t.text :description 
     t.timestamps null: false 
    end 
    end 
end 

Другой

class AddDescriptionToArticles < ActiveRecord::Migration 
     def change 
     add_column :articles, :description, :text 
     add_column :articles, :created_at, :datetime 
     add_column :articles, :updated_at, :datetime 
     end 
    end 

Моя схемы

ActiveRecord::Schema.define(version: 20160715020218) do 

    create_table "articles", force: :cascade do |t| 
    t.string "title" 
    t.text  "description" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    end 

end 

ответ

1

во второй миграции вынимают линию add_column :articles, :description, :text. Вы уже создали description столбец при создании articles таблицы в первой миграции, с линией t.text :description:

create_table :articles do |t| 
    t.string :title 
    t.text :description 
    t.timestamps null: false 
end 

Это дублирующие Рельсы столбец имеет в виду в сообщении об ошибке. В следующий раз перед запуском миграции вы можете проверить schema.rb файл, чтобы увидеть, что ваши таблицы баз данных выглядеть

пропущенным это в первый раз, но вы также дублируете свои метки времени столбцов, created_at и updated_at Таким образом, вторая миграция является ненужной

+0

Я добавил схему в исходное сообщение. Его все еще дает мне ошибку, и когда я делаю рейк db: migrate, он говорит мне, что у меня есть дубликат колонки в другом месте тоже –

+0

отредактировал ответ. вы также дублируете свои столбцы timestamp, когда ваша схема уже имеет их. – Ren

+0

Так что я удаляю все в def change? Странно, инструктор ОПРЕДЕЛЕНА написал все это в последней лекции. И его код отлично работает –

1

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

позволяет запускать через первый миграционный файл:

class CreateArticles < ActiveRecord::Migration 
    def change 
    create_table :articles do |t| 
     t.string :title 
     t.text :description 
     t.timestamps null: false 
    end 
    end 
end 

В create_table блоке вы имеете следующие строки: t.string :title < - это создает заголовок столбца типа строки. t.text :description < - это создает столбец описания текста типа. t.timestamps, null: false < - это создает две колонки: created_at и updated_at оба типа datetime с флагом not_null на них.

Теперь в вашей второй миграции файл, который вы пытаетесь добавить три колонки:

add_column :articles, :description, :text 
add_column :articles, :created_at, :datetime 
add_column :articles, :updated_at, :datetime 

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

+0

Да, я помню, мой инструктор просто учил нас, как создать новый файл миграции, если мы забыли добавить что-то вроде описания. Я думал, что нам нужно включить это, но поскольку я уже включил описание в первый файл миграции, я в порядке. Я просто смутился. Rails наверняка запутывает ха-ха! Спасибо –

+0

Ах, я вижу. Ну рад, что все это сейчас разрешилось! Получайте удовольствие от остальной части вашего обучения Ruby on Rails;) –

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