如何让您在下面找到的当前视图在您的帮助下看起来像是视图?
当前观点:
<%= 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"
答案 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
表示星期日是异常。
与简单的字符串列相比,序列化列的工作速度非常慢。您只需获取一个字符串,而不是比较数组与数组,而不是对每个读取进行序列化/反序列化,而不是比较字符串与字符串。它的效率更高。作为奖励,这些字符串可以整齐地编入索引。