【问题标题】:Ruby: How to store and display a day of the week?Ruby:如何存储和显示一周中的某一天?
【发布时间】:2011-07-06 00:27:11
【问题描述】:

我对 Ruby 比较陌生。我需要在我的活动模型上跟踪一周中的某一天。到目前为止,我的代码似乎不是最优雅的解决方案。我想知道是否有更好的方法。

到目前为止,这就是我的表单:

<%= form_for(@activity) do |f| %>
  <div class="field">
    <%= f.label :day %><br />
    <%= f.select :day, [['Sunday', 0], ['Monday', 1], ['Tuesday', 2], ['Wednesday', 3], ['Thursday', 4], ['Friday', 5], ['Saturday', 6]] %>
  </div>
<% end %>

当我需要显示星期几时:

<% days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] %>
<% @activities.each do |activity| %>
  <%= days[activity.day.to_i] %>
<% end %>

我怎样才能做得更好?随意提及我可能不知道的任何图书馆/宝石。

解决方案:

Ruby 提供了Date::DAYNAMES 常量,它是一个星期几的数组。我们可以在代码中重用它:

<%= form_for(@activity) do |f| %>
  <div class="field">
    <%= f.label :day %><br />
    <%= f.select :day, Date::DAYNAMES.zip((0..6).to_a) %>
  </div>
<% end %>

<% @activities.each do |activity| %>
  <%= Date::DAYNAMES[activity.day.to_i] %>
<% end %>

【问题讨论】:

  • 从编程的角度来看(不管 RoR 特殊类/函数),我希望与从一种格式到另一种格式的一天转换相关的所有逻辑都驻留在一个独立的类中,而不是直接在视图中.这与 Ruby 无关,与所有语言无关。

标签: ruby-on-rails ruby


【解决方案1】:

Ruby 的 Date 类已经定义了一个常量,该常量将日期名称保存在数组中:Date::DAYNAMES

例如,您可以执行以下操作:

days = []
Date::DAYNAMES.each_with_index { |x, i| days << [x, i] }

我不知道我是否一定会说这更好,但你绝对可以利用你已经可用的东西。

【讨论】:

  • “但您绝对可以利用已有的资源”。你应该利用已经可用的东西。重新发明轮子也是重新发明错误。
  • @Adrian 确实这个问题被标记为 Ruby on Rails,所以这会起作用,但也需要注意 Date::DAYS_INTO_WEEK 只能在 Rails 中使用。此外,根据您每周的工作方式,您将获得与 OP 所寻找的不同的一周开始时间(周一与周日)。
【解决方案2】:

最简单的方法(RoR)是使用内置常量:

Date::DAYS_INTO_WEEK
# => 
{:monday=>0,
 :tuesday=>1,
 :wednesday=>2,
 :thursday=>3,
 :friday=>4,
 :saturday=>5,
 :sunday=>6}

【讨论】:

    【解决方案3】:

    在最新版本中,您可以使用该常量定义一个枚举,然后将其用于不同的事情:

    在迁移中,day_of_week 是整数

    在模型中:

    enum :day_of_week => Date::DAYS_INTO_WEEK

    然后你可以在模型中使用搜索

    Model.day_of_weeks.keys[0..4] 将返回 ['monday', 'tuesday', .... 'friday']

    Model.monday 等价于Model.where("day_of_week = ?", 'monday')

    http://api.rubyonrails.org/classes/ActiveRecord/Enum.html

    【讨论】:

      【解决方案4】:

      为了简单起见,我会:

      • @activity.day中保存当天的纯文本名称而不是数字
      • 添加一个常量 DAYS,它可以存在于您的 Activity 模型中,但将来可能会移动到其他地方

      然后它看起来像:

      型号

      DAYS = ['monday','tuesday',...]
      
      validates_inclusion_of :day, :in => DAYS
      

      视图:表单

      <%= f.collection_select :day, Activity::DAYS, :to_s, :humanize %>
      

      查看:显示

      <%= activity.day.humanize %>
      

      保持简单,如果需要,您稍后会扩展它:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-16
        • 2016-03-01
        • 2021-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多