【问题标题】:Database Structure for Multiple Form Checkboxes in RailsRails 中多个表单复选框的数据库结构
【发布时间】:2011-10-03 09:02:04
【问题描述】:

我正在开发一个允许用户创建计划的 Rails 应用程序。在这样做时,他们应该能够选择事件发生在一周中的哪几天。我计划在表单中执行此操作的方式是每个工作日旁边的复选框,如下所示:

<%= f.check_box :monday %> <%= f.label :monday %>
<%= f.check_box :tuesday %> <%= f.label :tuesday %>
<%= f.check_box :wednesday %> <%= f.label :wednesday %>

等等……

但是,我发现这可能不是一种非常有效的处理方式,将每个日期作为布尔值存储在数据库中。在“显示”视图中显示日期将非常困难;我将不得不做类似的事情

Event Dates:
<% if @event.monday? %>
  Monday
<% end %>
<% if @event.tuesday? %>
  Tuesday
<% end %>
<% if @event.wednesday? %>
  Wednesday
<% end %>

这对我来说似乎不太理想。

我的另一个想法是在数据库中创建一个包含所有事件日期的字符串列,使用 attr_accesors 和模型方法来创建字符串 after_create。但是,在这种情况下,用户将如何编辑事件?

这让我想到,这里一定有某种我不知道的最佳实践(我以前从未尝试过用这种结构创建东西)。

有什么建议吗?

谢谢!

【问题讨论】:

  • 如果事件发生在星期几,您可以将其存储为 "1100101" 7 个数字 1 - 发生 0- 否
  • @Bohdan,确实如此,但如果我尝试返回并编辑事件,我会遇到麻烦,我希望在进入编辑页面时选中相应的复选框。
  • @Bohdan,很有趣。你能用一个更充实的例子作为答案吗?

标签: ruby-on-rails ruby-on-rails-3 forms database-design checkbox


【解决方案1】:

不要这样做:

我的另一个想法是在数据库中创建一个包含所有事件日期的字符串列,使用 attr_accesors 和模型方法来创建字符串 after_create。

这种事情只会导致问题,比如让每天的查询变得非常丑陋;例如,如果您将您的日子组合成一列,您将如何计算周一有多少活动可用?

相反,保留您的七个布尔值并向您的模型添加一个简单的便捷方法,该方法以更方便的格式返回日期。可能是这样的:

def days
  Date.DAYNAMES.map { |d| read_attribute(d.downcase) }
end

然后您可以在视图中简单地迭代 @event.days 并将日期编号映射到名称:

<% @event.days.each_with_index do |on_day, i| %>
  <% if on_day %>
    <%= Date.DAYNAMES[i] %>
  <% end %>
<% end %>

days 方法的具体细节以及您在 ERB 中如何处理它当然取决于您的具体情况。

【讨论】:

    【解决方案2】:

    比批准的代码更详细的代码“在我看来”应该是:

    型号:

    serialize :days
    
    def weekdays
        Date::DAYNAMES.map { |d| d.upcase }
    end
    

    查看:

    <% Model.weekdays.each do |day| %>
       <%= check_box :model, :days, { :multiple => true }, day.downcase, nil %> <%=day.downcase %>
    <% end %>
    

    【讨论】:

    【解决方案3】:
    %{Mon Tue ... Sun}.each_with_index do |day, index| 
      <%= check_box_tag 'name', '1', model.attribute[index].to_i %> 
    end 
    

    是的解决方法,但应该可以工作

    匹配数据库中周日发生的记录

    Model.where("models.name LIKE '1______'")
    

    【讨论】:

      猜你喜欢
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多