миграция рельсов: проверьте наличие нескольких столбцов - PullRequest
0 голосов
/ 22 марта 2019

У меня есть таблица компании, и я хочу проверить наличие нескольких столбцов, чтобы удалить их.

class RemoveSettingsReportColumnsFromCompany < ActiveRecord::Migration[5.1]
  def change
    if column_exists?( :companies, :automatically_send_report ) && column_exists?( :companies, :time_limit_for_sending_report ) && column_exists?( :companies, :report_fragment_color ) && column_exists?( :companies, :display_default_avatar )
      remove_column :companies, :automatically_send_report, :boolean
      remove_column :companies, :time_limit_for_sending_report, :integer
      remove_column :companies, :report_fragment_color, :string
      remove_column :companies, :display_default_avatar, :boolean
    end
  end
end

Как вы видите, существует избыточность использования функции column_exists , и я хочу лучше организовать и сократить мой код, может кто-нибудь сказать, есть ли способ использовать column_exists другим способом, и дать ему в качестве параметров все столбцы, которые я хочу удалить?

Ответы [ 2 ]

0 голосов
/ 22 марта 2019
FIELDS = %i[automatically_send_report time_limit_for_sending_report
            report_fragment_color display_default_avatar].zip(
         %i[boolean integer string boolean]).to_h

def up
  FIELDS.keys.each do |col|
    remove_column(:companies, col) if column_exists?(:companies, col)
  end
end

def down
  FIELDS.each do |col, type|
    add_column(:companies, col, type) unless column_exists?(:companies, col)
  end
end
0 голосов
/ 22 марта 2019

Можно немного упростить. Прежде всего - вы можете перечислить все атрибуты, используя Company.attribute_names. Он вернет массив. Таким образом, вы можете сделать что-то вроде:

if (%w[automatically_send_report time_limit_for_sending_report report_fragment_color display_default_avatar] - Company.attribute_names).empty?
  # migration code
end

Другое решение, немного красивее (IMO):

if Company.attribute_names.to_set.superset?(Set['automatically_send_report', 'time_limit_for_sending_report', 'report_fragment_color', 'display_default_avatar'])
  # migration code
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...