【问题标题】:How do I properly store multiple checkboxed values using SimpleForm?如何使用简单表单正确存储多个复选框值?
【发布时间】:2016-05-31 06:48:58
【问题描述】:

基本上我想在我的表单中创建一个接受复选框的选项(0 到所有接受的值)。

我喜欢枚举的结构,因为我获得了将整数存储在数据库中的性能速度,但我可以在我的代码中引用该符号。但是,当我存储多个值(如复选框)时,我怀疑是否可以使用枚举。

所以我认为它工作得最好的方式是将它存储为一个字符串,它也是一个数组。所以是这样的:

#  refactor_rule           :string           default([]), is an Array

那么我的表单是这样的:

<%= f.input :refactor_rule, collection: ["dry", "concise", "performant"], as: :check_boxes, class: "form-control" %>

这种方法的问题是当我只存储 1 或 2 个选项(即不是全部)时,属性如下所示:

q.refactor_rule
=> ["", "dry", "concise"]

我讨厌,因为 [0] 的值为空。

所以我的问题如下:

  1. 实现这一目标的最高效方法是什么?请注意,我的复选框中的选项是静态的,但该字段需要接受多个而不是 1?
  2. 如何只存储选中的值而不存储空值?
  3. 即使我存储多个值,是否有任何方法可以利用 Rails 内置的枚举功能?

【问题讨论】:

    标签: ruby-on-rails checkbox enums simple-form ruby-on-rails-5


    【解决方案1】:

    您应该考虑将布尔值存储为位字段,而不是枚举(高性能,但只允许存储单个值)或序列化数组(速度慢且需要存储空间)。这种方法将多个布尔值(标志)转换为单个整数列,其中每个标志在整数中都有自己的位位置。这当然会对性能产生巨大的积极影响 - 您可以使用 &amp; operator(在 MySQL 中)搜索任何标志组合,而不是尝试在文本列中搜索子字符串。

    看看 flag_shih_tzubitfields 宝石。这两个 gem 都增强了 Active Record,因此所有标志都像模型对象的单独“虚拟”属性一样起作用,并且它们提供了搜索这些属性的便捷方法。为此,您可能需要重写 simple_form 表单以使用 3 个单独的复选框而不是单个复选框。

    【讨论】:

    • 有趣...感谢您给我这个选项。我可能不会走这条路,但探索起来很有趣。
    【解决方案2】:

    你总是可以有这样的东西来“清理”你的属性:

    q.refactor_rule.reject!(&:empty?)
    

    这将拒绝数组中的所有空元素。请注意!reject! 替换它没有空元素,reject 只是返回它。您的来电!

    如果你真的需要在数据库中存储一个数组,你可以这样做,在你的迁移中:

    create_table :products do |t|
       t.text :tags, array: true, default: []
    end
    

    (来自 Plataformatec 的 this blog post

    【讨论】:

    • 如果我不在数据库中使用array,我该如何存储它?一个字符串?我已经将它设置为数据库中的数组。
    • 您不想将其存储为字符串,因为每次您想阅读/更新它时都必须对其进行解码。如果这对您有意义,请创建另一个模型(可能称为“RefactorRule”),关系为has_many :refactor_rules。这样,您将能够使用关联的力量并全速使用 Rails :)
    猜你喜欢
    • 2019-02-26
    • 2015-11-30
    • 1970-01-01
    • 2017-02-16
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多