Rails中多个表单复选框的数据库结构

时间:2011-07-12 06:43:40

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

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

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

等...

但是,我发现这可能不是一种非常有效的处理方法,将每个日期作为布尔值存储在数据库中。在'show'视图中​​显示日期非常困难;我必须做一些像

这样的事情
Event Dates:
<% if @event.monday? %>
  Monday
<% end %>
<% if @event.tuesday? %>
  Tuesday
<% end %>
<% if @event.wednesday? %>
  Wednesday
<% end %>

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

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

它让我思考,这里必定有一些我不了解的最佳实践(我以前从未试图用这种结构创造一些东西)。

有什么建议吗?

谢谢!

3 个答案:

答案 0 :(得分:6)

不要这样做:

  

我的另一个想法是在数据库中创建一个包含所有事件日期的字符串列,使用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中如何处理它当然取决于您的具体情况。

答案 1 :(得分:1)

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

<强>型号:

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 %>

答案 2 :(得分:0)

%{Mon Tue ... Sun}.each_with_index do |day, index| 
  <%= check_box_tag 'name', '1', model.attribute[index].to_i %> 
end 

是的解决方法但应该有效

匹配星期日发生的DB记录

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