2015-12-13 28 views
0

我嵌套模型看起来像下面轨道4型号:</p> <pre><code>"project": { "name": "My Project Name", "tasks_attributes": [ {"name": "Design prototype"}, {"name": "Home page UI prototype"}, {"name": "Other Miscellaneous task"} ] } </code></pre> <p>我知道我:如何使用JSON数据

class Project < ActiveRecord::Base 
    has_many :tasks 
    accepts_nested_attributes_for :tasks 
end 

class Project::Task < ActiveRecord::Base 
    attr_accessible :task_id, :name 
    belongs_to :Project 
end 

这我通过阅读CSV文件,建立我的JSON数据来创建记录可以让rails模型通过发布上面的json创建记录来创建跟随控制器的方法。

project_params = params.require(:project).permit(:name, tasks_attributes: [:name]) 
Project.new(project_params) 

因为我上载其到JSON进一步转换服务器csv文件,我想直接传递JSON数据模型来创建数据库里面记录(嵌套)。有没有办法做到这一点?

回答

1

答案取决于您是否允许用户上传CSV文件,或者您是否在服务器上手动执行此操作。

-

如果你正在做它的服务器上,我会用一个Rake task;如果你允许上传,你可以使用控制器操作。该代码将在两种情况下保持相似:

#CSV on Server 
#lib/tasks/csv_process.rake 
namespace :csv do 
    desc "Process the CSV" 
    task :process => :environment do 
    file_name = File["path/to/file"] 
    CSV.foreach(file_name, :headers => true) do |row| 
     Project.create row.to_hash 
    end 
    end 
end 

这rake任务然后可以使用rake csv:process,这既可以手动运行可以从该服务器运行bash shell中,或者将其绑到cron job

-

如果你想通过CSV的直接您的应用程序(虽然我没有这样做过),你会使用一个控制器的操作,例如以下内容:

#app/controllers/projects_controller.rb 
class ProjectsController < ApplicationController 
    def create 
     file = project_params[:file] 
     CSV.foreach(file, :headers => true) do |row| 
      Project.new row.to_hash 
     end 
    end 

    private 

    def project_params 
     params.require(:project).permit(:file) 
    end 
end 
0

您可以使用CSV类来解析CSV。

它会创建一个Hash,您将能够将它传递给你模型。

但请注意传递哪些参数。在将它们发送到数据库之前检查它们。否则,您将有可能不允许访问受保护的属性。例如,用户可以修改数据库中存在的role属性。

您可以在Strong Parameters文档中阅读有关此漏洞的更多信息。

快乐编码:)。

1

要回答如何能够保存JSON数据,这里是你能做什么:

  1. 解析您的CSV,建立自己的json =>data = your_json_here
  2. instance = YourModel.new(JSON.parse(data))#这是你的JSON数据转换成散列
  3. instance.save

没有测试,但是这是我脑海最快的东西。 确保在保存数据之前检查参数(再次说明您需要做的检查)

希望有所帮助!

+0

任何人都可以告诉我为什么答案是投下来的?它不是回答你的问题,还是答案错误?还是脱节了?在任何意义上,这个答案确实回答了这个问题,我认为没有理由拒绝投票。我很想从下来的选民那里得到一些解释,可能我错过了一些东西。 –

+0

'save'不是模型类的方法。也许,这是downvote的原因。 –

+0

修正了:)这是一个错字。 –

相关问题