Запустить файл миграции rails из действия контроллера - PullRequest
0 голосов
/ 07 мая 2018

У меня есть этот файл миграции rails (123blablabla.rb), который я хотел бы запустить при создании и обновлении действий. Как я об этом.

Миграция:

class CombineItemsInSale < ActiveRecord::Migration[5.1]
  def up
    Sale.all.each do |sale|
      sums = sale.items.group(:product_id).sum(:quantity)
      sums.each do |product_id, quantity|
        if quantity > 1
          sale.items.where(product_id: product_id).delete_all

          item = sale.items.build(product_id: product_id)
          item.quantity = quantity
          item.save!
        end
      end
    end
  end

  def down
    #split items with a quantity of 1 or more into multiple items
    Item.where("quantity>1").each do |item|
      item.quantity.times do
        Item.create(
          sale_id: item.sale_id,
          product_id: item.product_id,
          quantity: 1
        )
      end
      # remove original line item
      item.destroy
    end
  end
end

1 Ответ

0 голосов
/ 08 мая 2018

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

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

Теперь возвращаемся к теме

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

class Item < ActiveRecord::Base
  belongs_to sale
  after_commit :split
  ...
  def split
    self.sale.split_items
  end
end

class Sale < ActiveRecord::Base
  has_many items
  ...
  def split_items
    products_items = self.items.group_by(&:product_id)
    products_items.each do |product_id, items|
      if items > 1
        quantity = items.sum(:quantity)
        items.delete_all
        Item.create(product_id: product_id, quantity:quantity)
      end
    end
  end
end

Примечание Это не оптимальный способ сделать это, но он сделает свою работу.

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