Rails中多个表单复选框的数据库结构
我有一个我正在研究的rails应用程序,允许用户创建日程安排。 在这样做时,他们应该能够选择一周中哪一天发生事件。 我计划在表单中执行此操作的方式是每个工作日旁边的复选框,如下所示:
等等…
但是,我发现这可能不是一种非常有效的处理方法,将每个日期作为布尔值存储在数据库中。 在’show’视图中显示日期非常困难; 我必须做点什么
Event Dates: Monday Tuesday Wednesday
这对我来说似乎不太理想。
我的另一个想法是在数据库中创建一个包含所有事件日期的字符串列,使用attr_accesors和一个模型方法来创建字符串after_create。 但是,在这种情况下,用户将如何编辑事件?
它让我思考,这里必须有一些我不了解的最佳实践(我以前从未试图用这种类型的结构创建东西)。
任何建议?
谢谢!
不要这样做:
我的另一个想法是在数据库中创建一个包含所有事件日期的字符串列,使用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中如何处理它将取决于您的具体情况。
比批准的“在我看来”更详细的代码将是:
模型:
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 %>
%{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______'")