【问题标题】:list all records for current week, day by day, also show day if no records逐日列出当前一周的所有记录,如果没有记录也显示日期
【发布时间】:2016-01-30 00:27:33
【问题描述】:

为什么我的工作的每个执行块没有被解释? 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

预期输出:

25.01.2016
26.01.2016
工作1
27.01.2016
工作 2
28.01.2016
工作 3
工作 4
29.01.2016
30.01.2016

电流输出:

25.01.2016
26.01.2016
27.01.2016
28.01.2016
29.01.2016
30.01.2016
工作1
工作 2
工作 3
工作 4

【问题讨论】:

  • 尝试打印 due_day(day) .. 像这样: puts "Due date(s) is " ; all.select{|x| x.start_time.to_date == day} .. 有吗? .... 如果为 nil,您也可能会引发错误
  • 这是什么 Rails 版本?
  • 有趣:我必须阅读它,但实际上可以在带有块的作用域上使用select!但这并不能解决您的问题;) 问题可能只是在 HTML 中吗?您在&lt;tbody&gt; 内发出&lt;h3&gt;。因为根据您的输出,due_date 似乎找到工作就好了。
  • 在我看来,|day| 是通过h3= day.strftime("%d.%m.%Y") 循环的。之后它会打印所有作业。
  • 您的标记无效(tr 元素应仅包含 td/th 元素)。这很容易让浏览器做一些疯狂的事情——检查实际的 html 源代码

标签: ruby-on-rails ruby


【解决方案1】:

对@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 创建的散列上进行迭代,您不会得到它们没有任何值的散列键。因此,我的建议是遍历您感兴趣的星期几,并在那天之前访问哈希。

【讨论】:

    【解决方案2】:

    您的代码中有几个问题 正文

    # 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2016-04-19
      • 1970-01-01
      相关资源
      最近更新 更多