将数组排序到数组描述的条件方法?

时间:2016-03-09 18:32:38

标签: ruby-on-rails ruby methods model

如何让您在下面找到的当前视图在您的帮助下看起来像是视图?

当前观点:

<%= challenge.action %>
<% @challenge.committed.map { |d| d.titleize[0,3] }.each do |title| %>
  <%= title %> 
<% end %>

# EXAMPLES
# Run    Sun, Mon, Tue, Wed, Thu, Fri, Sat
# Meditate    Sun, Sat
# Do a Random Act of Kindness    Mon, Tue, Wed, Thu, Fri

在您的帮助下查看:

<%= @challenge.action %> <%= @challenge.committed_description %> # Trying to make committed_description work

# EXAMPLES
# Run everyday
# Meditate weekends
# Do a Random Act of Kindness weekdays

模型方法的总体思路(伪代码):

def committed_description
  if ["sun", "mon", "tue", "wed", "thu", "fri", "sat"]
   "everyday"
  elsif ["mon", "tue", "wed", "thu", "fri"]
    "weekdays"
  elsif ["sun", "sat"]
    "weekends" 
end

challenge.rb:

class Challenge < ActiveRecord::Base
  serialize :committed, Array

  def committed_wdays
    committed.map do |day|    
      Date::ABBR_DAYNAMES.index(day.titleize)
    end
  end
end

分贝:

t.text     "committed",       default: "---\n- sun\n- mon\n- tue\n- wed\n- thu\n- fri\n- sat\n"

1 个答案:

答案 0 :(得分:2)

如果你想弄清楚这是一个好的标签,请专门为此编写一个方法:

WEEKDAYS = %w[ mon tue wed thu fri ]
WEEKENDS = %w[ sat sun ]
DAYS = WEEKDAYS + WEEKENDS

def committed_description
  case DAYS & self.committed
  when DAYS
    'everyday'
  when WEEKDAYS
    'weekdays'
  when WEEKENDS
    'weekends'
  else
    self.commited.join(', ')
  end
end

Ruby可以直接比较数组与数组,看看它们是否相等并分支到相应的部分。这非常方便。

值得注意的是,使用阵列是非常沉重的。您可能希望使用较短的表示法,为每天分配一个唯一的字母并将其作为描述处理。例如:MTWHFSU是一个常见的映射,H表示星期四,U表示星期日是异常。

与简单的字符串列相比,序列化列的工作速度非常慢。您只需获取一个字符串,而不是比较数组与数组,而不是对每个读取进行序列化/反序列化,而不是比较字符串与字符串。它的效率更高。作为奖励,这些字符串可以整齐地编入索引。