Перезагрузить имена столбцов в классе модели ActiveRecord - PullRequest
12 голосов
/ 18 ноября 2009

У меня есть скрипт, использующий ActiveRecord, который динамически создает имена столбцов на основе значений, считанных из файла CSV, что-то вроде этого:

FasterCSV.foreach('votes.csv', :headers => true) do |row|
  column_name = "roll_call_id_#{row['roll_call_id']}"

  if !Legislator.columns.map(&:name).include?(column_name)
    connection_pool.connection.add_column('legislators', column_name, 'string')
  end
end

Проблема в том, что после создания нового столбца я не могу выполнить legislator.update_attribute(column_name, value), поскольку класс не берет новый столбец и жалуется, что его не существует.

Как мне сделать так, чтобы он снова запрашивал структуру таблицы?

Ответы [ 2 ]

31 голосов
/ 18 ноября 2009

Legislator.reset_column_information ( API info )

0 голосов
/ 19 марта 2016

Как указал obvio171, это довольно просто:

Вам необходимо создать класс модели заранее.

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

Затем вы можете использовать любой метод для создания новых записей.

Я использую что-то вроде:

data = [[1,'foo'], [2,'bar'],[3,'zip']].map{|a,b| {id:a, txt:b} }
MyModel.create!(data)

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

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