在 Rails 中保存和检索数组

2023-12-20

我正在 Rails 中开发电子学习,我想将一组数组保存到数据库中,目的是跟踪用户在电子学习各个部分的进度。

我遇到过这个问题并回答:
在数据库中存储数组:JSON 与序列化数组 https://stackoverflow.com/questions/21312278/storing-arrays-in-database-json-vs-serialized-array/21315340?noredirect=1#comment40564161_21315340
...听起来它可能很有用,但我不知道如何将它集成到我正在开发的 Rails 项目中。

鉴于我几乎是一个 Rails 菜鸟,有人可以用简单的英语(或者简单的代码)向我解释一下我会如何:
a) 将一个数组保存到数据库中,当用户最初注册时,该数组保存一系列“假”布尔值。
b) 在整个电子学习过程中从各个页面检索并更新该数组。

我会列出我已经尝试过的内容,但这只是在黑暗中进行的疯狂尝试,我真的不知道从哪里开始。 Comment 类应该保存在controllers 文件夹中吗?或者,在我的示例中,它实际上是 User 类(类似地,它扩展了 ActiveRecord)?

再次,非常感谢任何帮助(最好解释代码所属的位置)。

UPDATE

我被要求更具体,所以我会尝试:
我在数据库中有一个用户表,(可以预见)它有几个字段,包括电子邮件、用户名等。我想向用户表中添加 5 个字段,每个字段存储一个数组来跟踪用户在每个字段中的进度5个部分。我设想,当用户打开一段内容时,数组将被更新,并且适当的索引将被更新为“true”以标记该部分的该部分已完成。

我希望这有帮助...

重新更新

当用户第一次注册时,我希望使用一系列“假”布尔值设置数组。我将从哪个文件设置数组?这是在用户中完成的吗?目前我正在尝试这个,但我不认为这些值正在被设置 - 尽管它没有抛出错误。

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  serialize :leadership_styles_progress
  serialize :skills_progress
  serialize :safeguarding_progress
  serialize :tools_progress

  before_create :set_progress_vars

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
  validates :age, presence: { :message => ": Please choose your age" }
  validates :section, presence: { :message => ": Please choose the section you belong to"}
  has_many :posts

  private

  def set_progress_vars
    self.leadership_styles_progress = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
    self.skills_progress = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
    self.safeguarding_progress = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
    self.tools_progress = [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]
  end

end

我还通过“rake 路线”检查了哪些路线映射到了哪里; users/sign_up 映射到 devise/registrations/new。那么下面建议的序列化代码会去那里吗?


您提到 Comment 和 User 类扩展了 ActiveRecord。这些是模型,它们位于 app/models 文件夹中。

将数组保存到数据库非常简单,如您链接到的答案中所述。要将其集成到您的项目中,您所需要做的就是声明要在其中存储数组的属性,并且它们将在保存或更新时自动序列化,并在您想要读回它们时反序列化。

您绝对应该发布您已有的任何代码。我假设您想要序列化的属性位于 Comment 模型中,并且称为choices(但当然它可以是任何东西)并且它是一个文本字段(不是字符串字段,因为如果你的数组在序列化时增长超过 255 个字符,这可能会太短):

# app/models/comment.rb
class Comment < ActiveRecord::Base
  serialize :choices
end

就是这样!现在,当您为该属性分配值时@comment.choices = [false, false]当你保存时它会自动序列化为 YAML,然后当你读取它时它会被反序列化:

class CommentController < ApplicationController
  def create
    @comment = Comment.new choices: [false, false, true, 'stuff', 'whatever']
  end

  def show
    @comment = Comment.find params[:id]
    @comment.choices # returns [false, false, true, 'stuff', 'whatever']
  end
end

解释当您使用分配给数组值的记录保存时“幕后”发生了什么choices字段 ActiveRecord 知道您想要序列化它,因为您声明了serialize :choices在你的评论课上。它将获取该数组值并将其序列化,如下所示:

YAML.dump(choices)

这会将数组转换为以下字符串:

"---\n- false\n- false\n- true\n- stuff\n- whatever\n"

那就是YAML http://ruby-doc.org/stdlib-1.8.6/libdoc/yaml/rdoc/YAML.html#method-c-dump数组的表示(序列化)。读回它(当你打电话时comment.choices) ActiveRecord 将获取序列化字符串并将其反序列化:

YAML.load(choices)

然后,这会将 YAML 字符串转换回 Ruby 数组。

总结一下:

  • 将文本字段添加到您的模型中,例如choices:text当您创建迁移时。
  • Declare serialize :choices在你的模型中。
  • 正常使用。

希望有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Rails 中保存和检索数组 的相关文章

随机推荐

  • PHP 函数 session_module_name 到底有什么用?

    PHP Session 相关函数有这个 会话模块名称 http www php net manual en function session module name php 文档只说 session module name 获取和 或设置当
  • 如何以编程方式安装 VisualStudio 扩展?

    如何获取已安装的 VisualStudio 扩展的列表 不知何故通过DTE 只要名字就足够公平了 这有帮助吗 System IServiceProvider serviceProvider package as System IServic
  • 链接生成的 Jooq 类时如何解决不明确的匹配

    我已经在 J PA 中定义了我的模型 并正在为我的应用程序编写一些查询 并且我正在使用 JOOQ 生成的类将所有表连接在一起 以检查请求的资源是否确实属于请求用户 但是 当我这样做时 我收到以下警告 Ambiguous match foun
  • python split 多个分隔符错误?

    我正在查看对这个先前提出的问题的答复 使用多个分隔符分割字符串 https stackoverflow com questions 1059559 split strings with multiple delimiters 对于这个问题的
  • 带有圆角半径和阴影的 SWIFT UITableViewCell

    我一直在尝试创建一个带有圆角和阴影的自定义表格视图单元格 我设法创建了圆角 但阴影仅显示在角上 而没有显示在其他地方 对于阴影和圆角 您可以使用以下代码 override func tableView tableView UICollect
  • 如何使用https://angular.io/docs/ts/latest/guide/webpack.html中的vendor.ts

    根据https angular io docs ts latest guide webpack html https angular io docs ts latest guide webpack html您应该能够在vendor ts文件
  • Python MySQL 连接器返回字节数组而不是常规字符串值

    我正在将一张表中的数据加载到 pandas 中 然后将该数据插入到新表中 但是 我看到的不是普通的字符串值 而是字节数组 bytearray b TM16B0I8 它应该是TM16B0I8 我在这里做错了什么 My code engine
  • 构建 10x10 UIButton 网格的最佳方法?

    我将有一个 10x10 网格的 UIButton 对象 每个 UIButton 都需要通过行号和列号来引用 因此它们可能应该存储在某种类型的数组中 我的问题 创建这个网格的最简单方法是什么 以编程方式还是通过 Interface Build
  • Android:时间选择器对话框

    我一直在尝试在对话框中创建时间选择器 但在片段类中收到错误消息 该类型未定义方法 is24HourFormat Activity DateFormat 在以下行中 在行 DateFormat is24HourFormat getActivi
  • 自定义元素选择器

    有没有办法用 CSS 选择所有自定义元素 我想让所有自定义元素默认为块元素 大多数浏览器默认使它们内联 然后根据需要覆盖它 我的规则可能看起来像这样 custom display block 所有自定义元素在标准中都有破折号 因此我可以利用
  • WPF 中的错误提供程序

    我正在查看工具箱中的 WPF 组件 但找不到 2005 2008 中出现的错误提供程序 被移除了吗 the 错误提供者 http msdn microsoft com en us library system windows forms e
  • 当我们切换到夏令时并返回时处理日期

    我想用R进行时间序列分析 我想制作一个时间序列模型并使用 timeDate 和 Forecast 包中的函数 我有 CET 时区的日内数据 15 分钟数据 每小时 4 个数据点 3 月 31 日实施夏令时 我丢失了通常拥有的 96 个数据点
  • 正则表达式:两个匹配之间的负向预测

    我正在尝试构建一个类似这样的正则表达式 match word exclude specific word match word 这似乎适用于消极的前瞻 但当我遇到这样的情况时 我遇到了问题 match word exclude specif
  • Android 如何在PrimaryClipChanged 上从剪贴板获取字符串?

    我正在尝试使用以下侦听器将文本复制到剪贴板中 import android content ClipboardManager OnPrimaryClipChangedListener import com orhanobut logger
  • 性能方面 MVC 比 ASP.NET 中的 Web 窗体更好吗

    我们将在 ASP NET 中开发一个网站 那么是使用 MVC 还是 Web 表单更好呢 这取决于您想要建立什么样的网站以及您创建网站的知识和经验 如果您了解自己的知识并且对自己 接近金属 工作的能力 事实上 充满信心 我想您可以使用 ASP
  • 如何在 HQL 中转义冒号?

    我的查询的条件部分如下 where foo bar like 查询将执行但没有结果 我认为这是因为冒号 因为它是 HQL 中的保留字符 那么我怎样才能在不发送的情况下逃脱它 作为我的查询的参数 我已经用过 and 没有成功 我找到了一个解决
  • Python:filter(函数,序列)和map(函数,序列)之间的区别

    我正在阅读 Python 文档 以真正深入了解 Python 语言 并遇到了过滤器和映射函数 我以前使用过过滤器 但从未使用过映射 尽管我在 SO 的各种 Python 问题中都看到过这两种情况 在阅读了 Python 教程中的相关内容后
  • 使用@Factory和@DataProvider进行TestNG

    我对 TestNG 和 Java 编程非常陌生 我对一起使用 Factory 和 DataProvider 有疑问 我想测试多次提交网络表单 每次使用不同的输入数据 我有以下代码 public class SolicitudEmpleo e
  • Chart.js:在饼图之外显示标签

    图表 js 2 6 0 我需要渲染一个如下所示的图表 始终显示所有工具提示不是可接受的方式 因为它们不会以正确的方式呈现 不幸的是我还没有找到解决方案 我已经尝试过件标签插件 但这有同样的问题 因为它的标签重叠 我无法隐藏某些标签 这是使用
  • 在 Rails 中保存和检索数组

    我正在 Rails 中开发电子学习 我想将一组数组保存到数据库中 目的是跟踪用户在电子学习各个部分的进度 我遇到过这个问题并回答 在数据库中存储数组 JSON 与序列化数组 https stackoverflow com questions