Миграции с нуля ломаются, поскольку столбец в модели еще не существует - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть следующие модели и ассоциации.

class Stock < ApplicationRecord
  has_many :stock_components, -> {order(:position)} 

  ...
  before_save :set_default_values

   def set_default_values
     self.material_cost = 0.0 if self.material_cost.nil?
   end
  ... 
end

Когда я запускаю миграции с нуля, миграция, которая вставляет запись в эту таблицу, прерывается на строку self.material_cost = 0.0 if self.material_cost.nil? со следующим -

Caused by:
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'stock_components.position' in 'order clause': SELECT `stocks`.* FROM `stocks` INNER JOIN `stock_components` ON `stocks`
.`id` = `stock_components`.`component_id` WHERE `stock_components`.`stock_id` = 1 ORDER BY `stock_components`.`position` ASC

Это происходит потому, что миграция для добавленияпозиция еще не запущена.

Что может быть решением для этого?

1 Ответ

0 голосов
/ 14 декабря 2018

Это действительно прискорбно, но это распространенная проблема, которая почти никогда не решается.

Когда записывается перенос данных в модель, либо для изменения или задания значений, либо для добавления данных, обычно полагается намодель приложения (со всеми соответствующими обратными вызовами и т. д.).

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

Решение состоит в том, что вы НИКОГДА не должны использовать модели приложений в миграции, а скорее какую-то локальную модель, которая использует всенаходится в базе данных в то время:

class PopulateStock < ActiveRecord::Migration
  class Stock < ActiveRecord::Model
    self.table_name = 'stocks'
  end

  def up
    Stock.create(...)
  end
end

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...