从表中删除条目而不从数据库中删除它

时间:2013-06-21 13:44:56

标签: ruby-on-rails ruby ruby-on-rails-3

我已经构建了一个小型Web应用程序,其中主视图显示了一个表,管理员可以选择通过以下方式从数据库中删除它来删除行:

*.destroy

但是我想保留数据库中的所有条目,但仍然希望用户能够从表中删除行并且不确定如何进行此操作的选项。我在考虑使用两个不同的数据库表,但想检查是否有更简单的方法?

以下是我的主要观点:

<h1>Student List</h1>

<table class ="Tables">
<tr>
<th>First Name</th>
<th>Last Name</th>
<th>Date Submit</th>
<th>Floor Preference</th>
<th></th>
</tr>

<% @students.each do |student|%>
<tr>
<td><%= student.f_name %></td>
<td><%= student.l_name %></td>
<td><%= student.created_at %></td>
<td><%= student.floor_pref %></td>
<td><%= button_to 'Remove', student, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>
<% end %>
</table>
<br />
<%= link_to 'New Student', new_student_path %>

3 个答案:

答案 0 :(得分:6)

您可以通过使用布尔值在同一个表中创建一个额外的列来轻松完成此操作。 因此额外的列名称可以是isActive。 删除行的isActive将为0,其余为1。 在获取数据时,只需将额外检查放在isActive = 1

的位置

答案 1 :(得分:2)

rails g migration AddActiveToStudents active:boolean

然后在视图中,您可以在单击“删除”按钮时更改值

然后在.each do |student|

之后进行检查
<% if student.active %>
..........display..............
<% end %>

答案 2 :(得分:0)

这个解决方案需要更多的劳动力,但对我有用。我的步骤很相似,但我会提供更多详细信息,因为我是编程新手,所以我会假设还有其他人也是新手:

假设: - 您从一个模型,视图和控制器(例如Model is Foo)开始工作 - 您可以通过单击启动控制器操作的按钮从数据库中删除记录(&#34;销毁&#34;) - 如果您已获得关联,则从数据库中销毁记录会对您的应用造成问题。

  1. 为名为is_active的新列创建了一个迁移,w / datatype:boolean。验证rails是否正确创建了迁移。如果没有,请手动调整迁移文件。确保在对数据库进行任何更改后捆绑exec rake db:migrate。重新启动服务器。

  2. 通过将is_active变量设置为false来编辑控制器中的destroy动作。布尔值为&#39; true&#39;或者&#39; false&#39;。对我们来说,虚假&#39;将代表&#34;删除&#34;行(虽然它不会被删除在数据库中,只是从视图中隐藏。例如@ foo.is_active = false。请务必使用&#34; =&#34;运算符,它分配值。在视图中,您将使用不同的运算符(==)。确保在任何编辑后执行保存。例如@ foo.save。此外,注释掉任何销毁代码。例如#@ foo.destroy

    2a上。我还将is_active值设置为&#39; true&#39;在我的创建动作中。这可能没有必要,但到目前为止它对我有用。如果您进行了此调整,请记得保存。例如@ foo.is_active = true,@ foo.save

  3. 在显示结果的视图中,添加条件语句。我在表格中循环并绘制结果。我的if语句是在我的do循环之后。如果它评估为“假”&#39;我将展示一行文字。 ELSE,如果它评估为“真实”&#39;我会显示我的数据。 (通常,在后续行中我有:Do Loop,&#39; False&#39; iF Statement,Else,&#39; True&#39; Data,End tag)。

  4. 所以,在&#34; if&#34;声明我告诉你当你循环播放时,如果你看到foo.is_active为&#39; false&#39;的行,则显示此文本。否则(否则)显示&#39; else&#39;之间的数据。并且&#39;结束&#39;。注意视图中的操作符与控制器的不同之处。在视图中,我们检查是否相等(==),而不是将值赋给(=)。

    确保您调用的变量与您在控制器的销毁操作中设置的变量相匹配。它们必须一致,否则您将收到错误消息。在我弄清楚之前几个小时,这给了我一些问题。因此,如果您在控制器中设置@foo,那么您只能在视图中调用@foo。

    最后,我使用的视图是我的索引,但我也只是在我的show视图中的条件语句,所以我的用户可以打开或关闭is_admin。使用simple_form_for表单,我将is_admin变量添加为boolean,它在我的show form上显示为一个复选框。选中时,is_admin为&#39; true&#39;行将显示。如果未选中,则is_admin为&#39; false&#39;因此隐藏起来。