列出当前周,日复一日的所有记录,如果没有记录也显示日

时间:2016-01-30 00:27:33

标签: ruby-on-rails ruby

为什么我的每个工作块都没有被解释? Rails 4.2,Ruby 2.1.7。

# _jobs.html.slim

tbody
  - (Date.today.beginning_of_week..Date.today.end_of_week).to_a.each do |day|
    h3= day.strftime("%d.%m.%Y")
    - Job.due_day(day).each do |job|
      <from here its ignored>
      tr= job.start_time
      tr= job.name
      ...


# job.rb

def self.due_day(day)
  all.select{|x| x.start_time.to_date == day}
end

预期产出:

2016年1月25日
2016年1月26日
工作1
2016年1月27日
工作2
2016年1月28日
工作3
工作4
2016年1月29日
30.01.2016

当前输出:

2016年1月25日
2016年1月26日
2016年1月27日
2016年1月28日
2016年1月29日
2016年1月30日
工作1
工作2
工作3
工作4

2 个答案:

答案 0 :(得分:2)

@ mixan946答案的一小部分内容:

def self.grouped_by_week_day
  today = Date.today
  where(start_time: today.beginning_of_week..today.end_of_week)
    .group_by { |job| job.start_time.to_date }
end

# make the call outside the loop in order to make the SQL query once.
- jobs_grouped_by_week_day = Jobs.grouped_by_week_day
- (Date.today.beginning_of_week..Date.today.end_of_week).each |day|
    h3= day.strftime("%d.%m.%Y")
    - next if jobs_grouped_by_week_day[day].blank?
    table
        - jobs_grouped_by_week_day[day].each do |job|
        <from here its ignored>
        tr:td= job.start_time
        tr:td= job.name

不同之处在于迭代使用group_by创建的哈希,您不会获得它们没有任何值的哈希的键。因此,我的建议是迭代您感兴趣的一周中的日子,并在当天访问哈希值。

答案 1 :(得分:1)

您的代码中存在几个问题 TBODY

# Doing in this way is very slow when you have noticeable amount of records
# it's responsibility of database to work with data
def self.due_day(day)
  all.select{|x| x.start_time.to_date == day}
end

我建议下一个解决方案:

def self.grouped_by_week_day
  today = Date.today
  # All type conversions handled by ActiveRecord 
  where(start_time: today.beginning_of_week..today.end_of_week)
    .group_by {|j| j.start_time.to_date }    
end

- Job.grouped_by_week_day do |day, jobs|
    h3= day.strftime("%d.%m.%Y")
    # It's better to not paste non-table related markup in tables
    # so leave h3 in outer of table
    table
      - jobs.each do |job|
        <from here its ignored>
        # To show cell use td, not tr
        tr:td= job.start_time
        tr:td= job.name