Как мне создать новую таблицу БД для каждого CSV, загружаемого пользователем в Rails 3? - PullRequest
0 голосов
/ 29 февраля 2012

Я создаю приложение Rails, где пользователи будут загружать файлы CSV. Эта часть уже работает.

Когда каждый файл загружен, я хочу создать для него новую таблицу в базе данных (с именем что-то уникальное, например csv_USERNAME_CSVID). Когда он создан, запись должна быть помещена в другую таблицу «csv_tables», которая ссылается на каждую таблицу, соответствующую CSV.

Что мне нужно, так это возможность выполнять операции CRUD с использованием синтаксиса Rails, как я делаю для всего остального - например, Table.create (), Table.find () и Table.destroy (), а также для каждого строка данных в этой таблице через цепочку методов.

Как мне это сделать в Rails?

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

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Вероятно, это неправильный путь.

В Rails предполагается, что объектами модели будут строки в таблице, а не вся таблица. Работа против этого предположения сделает ваше приложение очень сложным в управлении; вам, вероятно, следует реструктурировать свою модель так, чтобы каждый отдельно загруженный файл CSV представлял собой строку в таблице, а не саму таблицу.

0 голосов
/ 29 февраля 2012

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

Для ссылки на создание задачи rake для базы данных SQL нажмите here Для ссылки на создание задачи rake для NOSQL DBS нажмите здесь

Вот пример альтернативного создания метода класса (в случае, если вы не хотите создавать грабли):

def self.populate_isd_codes
require 'csv'
csv_text = File.read("#{Rails.root}/data/import/phone/country_isd_codes.csv")
csv = CSV.parse(csv_text, :headers => true, :col_sep => ";")
csv.each do |row|
  row = row.to_hash.with_indifferent_access
  self.create!(row.to_hash.symbolize_keys)
  end
end

Вы можете использовать этот методиз консоли rails, набрав table_name.method

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

...