gpt4 book ai didi

ruby-on-rails - 将 POST 提交的项目数组解析并保存为单独的单个项目

转载 作者:太空宇宙 更新时间:2023-11-03 16:01:33 27 4
gpt4 key购买 nike

我的用户正在提交包含多个项目的请求。不管项目如何保存到 SQL 数据库中,为了更容易分析,我需要解析每个项目并将其作为单独的数据行保存在 Excel 文件 (Google Drive) 中。

换句话说,在 SQL 中,请求看起来像这样:{:name => "john", :email => "john@gmail.com", :items => ["a", "b", "c"],但我需要将其转换为文档,其中每个项目有 3 行,并且各行之间唯一不同的是项目。

  • 第 1 行的名称 = John,电子邮件 = John@gmail.com,项目 = a
  • 第 2 行的名称 = John,电子邮件 = John@gmail.com,项目 = b
  • 第 3 行的名称 = John,电子邮件 = John@gmail.com,项目 = c

我在下面的工作,但我想知道它是否是最有效的,无论是从以下角度来看:

  1. 首先有没有更简单的方法来获取参数?
  2. 是否有更简单的方法来解析和保存个人数据?

谢谢!

型号代码

class Request < ActiveRecord::Base

serialize :items
validate :must_have_one_item

def must_have_one_item
errors.add(:items, 'You must select at least one item') unless self.items.detect { |i| i != "0" }
end

end

查看代码

<%= f.check_box(:items, {:multiple => true}, "#{thing}") %>
<%= f.label(:items, "#{thing}") %>

此处,thing 是迭代器函数的一部分,该函数遍历要选择的潜在项目的预定义列表。

CONTROLLER 代码,有很多注释!

class RequestsController < ApplicationController

def new
@requestrecord = Request.new
end

def create
@requestrecord = Request.new(request_params)

if @requestrecord.save

# Given model/ form code so far, the items are passed through as an array. The remaining comments uses the example: @requestrecord.items = ["water filter", "tent", "0", "0", "0"]. What happens is that "0" represents blank checkboxes
@requestrecord.items.select! { |x| x != "0" } #removes blank checkboxes; @requestrecord.items = ["water filter", "tent"]
num_of_requests = @requestrecord.items.count #counts number of items requested; num_of_requests = 2

i = 0
cloned_request = Hash.new
while i < num_of_requests do
cloned_request[i] = Marshal.load(Marshal.dump(@requestrecord)) #creates a cloned_request[0] = @requestrecord and cloned_request[1] = @requestrecord
cloned_request[i].items = @requestrecord.items.slice(i) #disaggregates the items into the cloned_requests; cloned_request[0].items = "water filter", cloned_request[1].items = "tent"
i += 1
end

cloned_request.each do | key, request |
request.save_spreadsheet
end

else
render 'new'
end
end

private
def request_params
params.require(:request).permit({:items => []})
end

end

最佳答案

好吧,这里有很多问题。

首先,尽量不要在数据库中存储数据数组,就像您使用serialize :items 所做的那样。您可以详细了解为什么 here .你应该做的是拥有一个名为 Item 的模型,它有自己的表。从那里,您可以将它与使用更多模型的其他模型相关联,例如具有 item_id 和 user_id 属性作为整数的 UserItem 模型。此 UserItems 是您的关联模型,它包含有关项目和用户如何关联的信息(即哪些用户拥有哪些项目)。如果请求和项目需要关联,您也可以创建 RequestItem 模型。

当用户提交项目列表时,您可以从 params[:request][:items] 哈希中获取每个项目,并使用

创建它的记录
params[:request][:items].each do |item|
UserItem.create(user_id: @user.id, item_id: item.to_i)
end

请注意它说的是 item.to_i。这是因为,一旦有了 Items 表,每个项目都会有一个 ID。一旦您更改 View 以向您发送 item_id(而不是项目名称),您就可以使用上述逻辑轻松地为其创建 UserItems。 (使用 to_i 是因为大多数时候数据是作为字符串发送的,您需要将其转换为整数)。

其次,您真的应该将您的业务逻辑移至其适当的模型,或至少移至一个助手。原则上,您的 Controller 应该“瘦”,而您的模型应该“胖”。这有很多原因,但在我看来最重要的一个是它使您的代码更容易测试。您可以阅读更多相关信息 here .

关于ruby-on-rails - 将 POST 提交的项目数组解析并保存为单独的单个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23861731/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com