2012-02-29 1 views
0

Я создаю приложение Rails, в котором пользователи будут загружать файлы CSV. Эта часть уже работает.Как создать новую таблицу DB для каждого CSV, загружаемого пользователем в Rails 3?

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

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

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

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

ответ

1

Возможно, это не совсем правильный путь.

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

+0

Это означает, что я потеряю способность сортировать, фильтровать и иным образом манипулировать данными в CSV, что является значительной частью цели приложения. – msolomon

+0

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

+0

Не можете ли вы манипулировать данными как строки? Какие преобразования вы можете достичь с помощью таблицы, которую вы не можете достичь в виде строки? – Veraticus

0

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

Для ссылки на создание рек задачи для SQL DB нажмите here Для ссылки на создание задачи грабель для NoSQL DBS мыши here

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

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 

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

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

Смежные вопросы