Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 根据数据库预先选中rails表单中的复选框,然后在提交后更新数据库_Ruby On Rails_Sqlite - Fatal编程技术网

Ruby on rails 根据数据库预先选中rails表单中的复选框,然后在提交后更新数据库

Ruby on rails 根据数据库预先选中rails表单中的复选框,然后在提交后更新数据库,ruby-on-rails,sqlite,Ruby On Rails,Sqlite,我正在开发我的第一个rails应用程序,遇到了一个问题。基本上,在我的用户模型中,我有一个名为likes的列,默认情况下,该列设置为一个零字符串,该字符串中的每个位置都应该表示一个特定的复选框。数据库是sqllite3,如果这有区别的话。我的复选框设置如下 //The string in question is stored in <%= current_user.likes %> <%= form_tag do %> <%= check_box_tag(:lik

我正在开发我的第一个rails应用程序,遇到了一个问题。基本上,在我的用户模型中,我有一个名为likes的列,默认情况下,该列设置为一个零字符串,该字符串中的每个位置都应该表示一个特定的复选框。数据库是sqllite3,如果这有区别的话。我的复选框设置如下

//The string in question is stored in
<%= current_user.likes %>

<%= form_tag do %>
<%= check_box_tag(:like_acoustic) %>
<%= label_tag(:like_acoustic, "Acoustic") %>
//More checkboxes
<%= submit_tag 'Save' %>
//有问题的字符串存储在
//更多复选框

我要做的是,如果字符串中的对应值为1,则预先选中任何复选框(当页面加载时),如果值为0,则不选中这些复选框。因此,“100”将导致选中第一个复选框,而不选中第二个复选框。然后,单击submit按钮时,我希望根据复选框当前表示的内容生成一个新字符串(1表示选中,0表示未选中),并使用此新值更新当前的_user.likes。我只是在学习rails,所以我真的非常感谢所有的帮助。谢谢

您可以将字符串
当前用户。likes
拆分为一个数字数组,然后对其进行迭代:

<% current_user.likes.split("").each do |like| %>
  <%= "Label" %>
  <%= check_box_tag 'likes[]', !like.to_i.zero?, !like.to_i.zero? %>
<% end %>

除非您有令人信服的体系结构原因(例如,您正在使用遗留数据库),否则我强烈建议您不要这样设置数据库。从字符比较中获得的任何性能优势都将被查询数据库的低效率抵消十倍

相反,因为您使用的是Rails,所以请按照Rails的方式进行

在数据库中为每种类型的相似项包含一列。然后,当您编写表单时,您可以利用所有Rails的表单帮助程序,而无需解析1和0

<%= check_box_tag(:like_acoustic) %>
<%= label_tag(:like_acoustic, "Acoustic") %>

你用这种方式存储喜欢的原因是什么?我使用喜欢来匹配用户,我使用的算法会逐字符比较字符串,所以将它们存储为1和0的字符串似乎是有意义的。这让我觉得这是一个错误的秘诀。如果您可以将类似的内容存储在名为
的列中,比如_audiotic
,等等,那么使用Rails约定构建起来会容易得多,对于其他平台来说,它将更易于维护,对于其他格式来说,它将是人类可读的。这很有意义,就像每种类型的列一样,并将它们视为布尔值?我对rails和数据库类型的东西非常陌生,但我只是假设比较单个数据库列要比比较字符串的字符慢。(我没有太多的依据)您可能从字符串比较中获得的任何性能优势都会被数据库效率低下所抵消。我建议改为使用Rails约定-为每种类型的相似项单独设置一列可能会带来很大的开销,但明确显示也会使将来更容易管理数据并了解应用程序中发生的情况。这样会生成所有复选框,但默认情况下它们都会被填充(默认字符串为0)我将如何标记这些复选框?更新-您可能需要将0和1转换为布尔真/假。因此,如果我想为每个复选框指定一个唯一的名称,如genre1,genre2等等,我会创建一个由某个东西分隔的所有名称的字符串,还是我可以使用一堆if语句来更改label的值?您可以使用
每个带有_索引的
像这样:
非常感谢!我现在正在处理自定义名称,仍在尝试获得喜欢的名称。join(“”)开始工作,但如果这是一个愚蠢的问题,我希望我能解决这个问题,但创建所有新列的存储空间开销是多少?代表所有类型的字符串长度约为114位,因此我会查看数据库中的许多新列。114列可能会很多,但我怀疑存储空间会增加多少。更可能的是,这会使UI变得笨拙。另一个仍然是Rails-y的选项是使用PostgreSQL的hstore格式。然后您可以有一个名为likes的列,并在likes列中以散列形式存储流派和赌注值。这仍然可以有效地进行查询,并且在ui中更易于管理。
<%= check_box_tag(:like_acoustic) %>
<%= label_tag(:like_acoustic, "Acoustic") %>
User.where(like_acoustic: true)