如何为用户在Rails 3中上传的每个CSV创建新的数据库表?

时间:2012-02-29 01:31:13

标签: ruby-on-rails database ruby-on-rails-3 database-design

我正在创建一个Rails应用,用户将上传CSV文件。这部分已经有效了。

在上传每个文件时,我想在数据库中为它创建一个新表(命名为csv_USERNAME_CSVID之类的唯一文件)。 创建时,应将条目放在另一个表'csv_tables'中,该表引用与CSV对应的每个表。

我想要的是能够使用Rails语法执行CRUD操作,就像我为其他所有操作一样 - 例如,Table.create(),Table.find()和Table.destroy(),以及该表中的数据行通过方法链接。

我如何在Rails中执行此操作?

如果无法做到这一点,那么下一个最佳选择是编写一系列辅助函数来执行执行这些操作所需的原始SQL查询吗?

2 个答案:

答案 0 :(得分:1)

这可能不是解决这个问题的正确方法。

Rails假定模型对象将成为表中的行,而不是整个表。违背这一假设将使您的应用程序难以管理;您应该重新构建模型,以便每个单独上载的CSV都是表格中的一行,而不是表格本身。

答案 1 :(得分:0)

您可以编写一个rake任务,用于将数据从csv文件导入到表中。 但我更喜欢一种为我做这项工作的课程方法。

有关为SQL DB创建rake任务的参考,请单击here 有关为NOSQL DBS创建rake任务的参考,请单击here

以下是另一个创建类方法的示例(如果您不想创建rake任务):

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

在rails控制台中使用此方法

确保在导入数据之前创建一个表,其中包含与csv文件标题行同名的字段。