Почему моя миграция Rails DB не создает coluimns? - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь выполнить миграцию БД в Rails с использованием PostgreSQL, но полученная схема не содержит ни одного из моих определений таблиц.Что-то не так с моим синтаксисом, который я не вижу?

Вот пример одного из моих файлов миграции и результирующего файла схемы после того, как я запустил "rake db: migrate".

Файл миграции:

class Fields < ActiveRecord::Migration[5.2]

      def change

        def up



          create_table :fields do |t|

            t.column :totalsalesprsn, :float, :limit => nil, :null => false

            t.column :totaladmkspend, :float, :limit => nil, :null => false

            t.column :totalsalescost, :float, :limit => nil, :null => false

            t.column :miscsales, :float, :limit => nil, :null => false

            t.column :numleads, :float, :limit => nil, :null => false

            t.column :costleads, :float, :limit => nil, :null => false

            t.column :totalsalescost2, :float, :limit => nil, :null => false

            t.column :totalmarketspent, :float, :limit => nil, :null => false

            t.column :numsales, :float, :limit => nil, :null => false

            t.column :averagecost, :float, :limit => nil, :null => false

            t.column :costpersale, :float, :limit => nil, :null => false

            t.column :totalspending, :float, :limit => nil, :null => false

            t.column :totalsalesdonate, :float, :limit => nil, :null => false

            t.column :totalsales, :float, :limit => nil, :null => false

            t.column :pototal, :float, :limit => nil, :null => false

            t.column :posales, :float, :limit => nil, :null => false



            t.column :form_id, :integer

            t.column :created_at, :timestamp

          end

        end



        def down

          drop_table :fields

        end

      end

    end

Файл схемы:

ActiveRecord::Schema.define(version: 2018_10_25_161515) do



  # These are extensions that must be enabled in order to support this database

  enable_extension "plpgsql"



  create_table "fields", force: :cascade do |t|

    t.datetime "created_at", null: false

    t.datetime "updated_at", null: false

  end



  create_table "forms", force: :cascade do |t|

    t.datetime "created_at", null: false

    t.datetime "updated_at", null: false

  end



  create_table "tables", force: :cascade do |t|

    t.datetime "created_at", null: false

    t.datetime "updated_at", null: false

  end



end

Будет ли это иметь какое-то отношение к файлам моей модели?Я понятия не имею, почему это происходит, и я не могу опубликовать больше кода, потому что мне нужно было бы добавить больше подробностей к этому сообщению, чтобы избежать предупреждения о том, что в моем вопросе недостаточно подробностей.

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

ваш синтаксис несколько неверен:

class Fields < ActiveRecord::Migration[5.2]
  def change
    def up
     # your table definition
    end
  end

  def down
    # delete your table
  end
end

Rails достаточно умен, чтобы знать, что обратная сторона создания таблицы - это удаление, поэтому вам не нужно указывать def down.

Похоже, вы не видите ошибок при переносе, поэтому перед тем, как выполнить следующее, выполните команду rails db:rollback с консоли

Затем измените файл миграции наследовать и запустить снова rails db:migrate:

class Fields < ActiveRecord::Migration[5.2]
  def change
   # your table definition
  end
end
0 голосов
/ 26 октября 2018

Другие ответы здесь верны.Однако, если вы уже запустили миграцию и не получили ошибки, вам, вероятно, придется откатить ее, но если это не удастся, вам придется вручную откатить миграцию в базе данных.Поскольку любая миграция будет увеличивать schema_migrations с номером версии в имени файла миграции.

Так что, если ваше имя файла миграции выглядит примерно так: 20181023191125_fields.rb, вам нужно сделать это:

rails dbconsole
#now you should be in a (pg?) console
DELETE from schema_migrations WHERE version = 20181023191125;
\q # to quit postgres

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

ТОЛЬКО ДЕЛАЙТЕ ЭТО, ЕСЛИ ВЫ ХОРОШОС УБИВАЮЩЕЙСЯ БД И НАЧИНАЮТ НАД !!

rake db:setup
# or
rails db:setup

См. Разница между рейком db: перенос db: сброс и db: схема: загрузка

0 голосов
/ 26 октября 2018

Он не создает столбцы, потому что вы определяете up и down в методе change.

Попробуйте это

class Fields < ActiveRecord::Migration[5.2]
  def up
    create_table :fields do |t|
      t.column :totalsalesprsn, :float, :limit => nil, :null => false
      t.column :totaladmkspend, :float, :limit => nil, :null => false
      t.column :totalsalescost, :float, :limit => nil, :null => false
      t.column :miscsales, :float, :limit => nil, :null => false
      t.column :numleads, :float, :limit => nil, :null => false
      t.column :costleads, :float, :limit => nil, :null => false
      t.column :totalsalescost2, :float, :limit => nil, :null => false
      t.column :totalmarketspent, :float, :limit => nil, :null => false
      t.column :numsales, :float, :limit => nil, :null => false
      t.column :averagecost, :float, :limit => nil, :null => false
      t.column :costpersale, :float, :limit => nil, :null => false
      t.column :totalspending, :float, :limit => nil, :null => false
      t.column :totalsalesdonate, :float, :limit => nil, :null => false
      t.column :totalsales, :float, :limit => nil, :null => false
      t.column :pototal, :float, :limit => nil, :null => false
      t.column :posales, :float, :limit => nil, :null => false
      t.column :form_id, :integer
      t.column :created_at, :timestamp
    end
  end

  def down
    drop_table :fields
  end
end

Пожалуйста, ознакомьтесь с документацией здесь о том, как определить миграции.


Из документации

Метод изменения является основным способом написания миграции.Это работает в большинстве случаев, когда Active Record знает, как автоматически отменить миграцию.

Таким образом, вы также можете определить миграцию, выполнив следующую команду:

class Fields < ActiveRecord::Migration[5.2]
  def change
    create_table :fields do |t|
      t.column :totalsalesprsn, :float, :limit => nil, :null => false
      t.column :totaladmkspend, :float, :limit => nil, :null => false
      t.column :totalsalescost, :float, :limit => nil, :null => false
      t.column :miscsales, :float, :limit => nil, :null => false
      t.column :numleads, :float, :limit => nil, :null => false
      t.column :costleads, :float, :limit => nil, :null => false
      t.column :totalsalescost2, :float, :limit => nil, :null => false
      t.column :totalmarketspent, :float, :limit => nil, :null => false
      t.column :numsales, :float, :limit => nil, :null => false
      t.column :averagecost, :float, :limit => nil, :null => false
      t.column :costpersale, :float, :limit => nil, :null => false
      t.column :totalspending, :float, :limit => nil, :null => false
      t.column :totalsalesdonate, :float, :limit => nil, :null => false
      t.column :totalsales, :float, :limit => nil, :null => false
      t.column :pototal, :float, :limit => nil, :null => false
      t.column :posales, :float, :limit => nil, :null => false
      t.column :form_id, :integer
      t.column :created_at, :timestamp
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...