Rails 4模型:如何使用json数据创建记录

时间:2015-12-13 16:55:59

标签: ruby-on-rails ruby 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数据:

"project": {
      "name": "My Project Name",
      "tasks_attributes": [
        {"name": "Design prototype"},
        {"name": "Home page UI  prototype"},
        {"name": "Other Miscellaneous task"}
     ]
}

我知道我可以让rails模型通过在json上面发布来创建跟踪控制器的方法来创建记录。

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

由于我将csv文件上传到服务器上并进一步转换为json,我想将json数据直接传递给模型以在db中创建记录(嵌套)。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:1)

要回答如何保存json数据,请按以下步骤操作:

  1. 解析你的csv并构建你的json =&gt; data = your_json_here
  2. instance = YourModel.new(JSON.parse(data))#将您的json数据转换为哈希
  3. instance.save
  4. 未经测试,但这是我想到的最快的事情。 确保在保存数据之前检查参数(再次需要检查)

    希望有所帮助!

答案 1 :(得分: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 csv:process运行此rake任务,#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 可以从服务器bash shell手动运行,也可以将其绑定到cron job

-

如果您想直接将CSV传递给您的应用(虽然我之前没有这样做过),您可以使用控制器操作,如下所示:

insert into auth_user(id, user_name) 
values((select a from  generate_series((select min(id) from auth_user)
                                      ,(select max(id)+1 from auth_user)
                                      ) as a 
                       left join auth_user on (a = id )
                       where id is null order by a limit 1)
      , 'new user')

答案 2 :(得分:0)

您可以使用CSV类解析CSV。

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

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

您可以在Strong Parameters的文档中详细了解此漏洞。

快乐的编码:)。