检查哈希是否存在匹配值

时间:2013-08-12 20:26:07

标签: ruby-on-rails ruby hash

我正在构建一个列出课程(“部分”)的学校日历,并显示这些课程的学期和考试日期。日历将被提供一个在Section.rb模型中定义的哈希:

  def get_calendar

    calendar = {}
    calendar[:semesters] = Semester.where(section_id: self.id)
    calendar[:exams] = Exam.where(section_id: self.id)

    { :calendar => calendar }

  end

SemesterExam个对象包含namestart_dateend_date

循环播放日历的每一天时,如何检查是否有一个学期或考试 start_date end_date 那天的循环?

如果有一个学期或考试的start_dateend_date与日历日期匹配,我会显示名称。

日历日期以及start_dateend_date字段均使用Date类(link)。

我真诚地感谢你的帮助。如果需要,我可以澄清这个问题:)

谢谢!

2 个答案:

答案 0 :(得分:1)

也许你应该重新思考你的哈希,并以这种方式使用它:

def get_calendar
  semesters = self.semesters
  exams = self.exams

  events = { }

  (semesters + exams).each do |event|
    start_date = event.start_date.to_s
    events[start_date] ||= []
    events[start_date] << event

    end_date = event.end_date.to_s
    events[end_date] ||= []
    events[end_date] << event
  end

  events
end

测试构建日历的循环中是否存在事件:

dates_of_calendar.each do |date|
  if @events[date.to_s].present?
    # well, there is an event happening for this date! treat it as your wishes!
  end
  # etc...
end

答案 1 :(得分:1)

可枚举的检测方法是否有效? http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-detect

因此,你的情况循环可能是......

semesters.detect{|s| s.begin_date > cal_begin_date ... //more conditions here} && 
exams.detect{|e| e.begin_date > cal_begin_date ... //more conditions here}