控制器中的Ruby Rails循环

时间:2016-08-11 19:22:43

标签: ruby-on-rails ruby

我有一个控制器,我想用来生成报告,我的第一个报告工作得很好,它只是我的CSEmployee表的排序输出。然而,我的第二份报告并未给出我的期望。每个CS_Employee可以在与之关联的TimeEntry表中具有多个time_entries。我已经为表编制了索引并创建了一个has_many \ belongs_to关系,所有这些似乎在我的其他视图中都能正常工作。我的第二个报告需要显示给定时间段内每个CS_Employee的所有相关time_entries。以下是我到目前为止的情况:

def cs_employees
  @cs_employees = CsEmployee.all
  @cs_employee = @cs_employees.order(:cs_name)
  respond_to do |format|
    format.html
    format.csv { send_data @cs_employee.to_csv }
    format.xlsx #{ send_data @cs_employee.to_csv(col_sep: "\t") }
  end

def schedules
  @start_date = params[:start_date] || 2.weeks.ago
  @end_date = params[:end_date] || Date.today
  @cs_employee = CSEmployee.all
  @cs_employees.each do |cs_employee|
    @cs_employee = cs_employee.find(params[:cs_employee_id])
    @time_entries = @cs_employee.time_entries.find(params[:id])
    @time_entries.each do |time_entry|
      tschedules = time_entry.where(:date => (params[:start_date]).to_date..(params[:end_date]).to_date)
      @schedules += tschedules if tschedules
    end
  end
end

当我尝试调试@schedules时,变量中没有任何内容。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

当您拨打@cs_employees时,您似乎没有填充@cs_employees.each变量

此外,您的控制器中存在太多业务逻辑。将其移至模型或关注点。

答案 1 :(得分:0)

def schedules
  @start_date = params[:start_date] || 2.weeks.ago
  @end_date = params[:end_date] || Date.today
  @cs_employees = CsEmployee.all
  @cs_employees.each do |cs_employee|
    ....
  end
end

答案 2 :(得分:0)

所以,在得到对这个问题的回答并尝试了一些建议之后,事实证明我的循环是一团糟。我最终将逻辑移到了模型中,正如我所指出的那样,它属于模型。生成的代码更简单。这就是现在的样子。

这就是我在模型中所拥有的,连接允许我访问我所有报告所需的所有字段,而不仅仅是日程安排报告。

  def self.report(start_date, end_date)
    Costcenter.joins(:time_entries)
    CsEmployee.joins(:time_entries)
    Maintenancecode.joins(:time_entries)
    Unit.joins(:time_entries)
    Workcode.joins(:time_entries)
    TimeEntry.where( :date => start_date..end_date )
  end 

以下是我现在在控制器中的代码:

  def schedules
    @start_date = params[:start_date] || 2.weeks.ago.to_date
    @end_date = params[:end_date] || Date.today
    @schedule_report = TimeEntry.report(@start_date, @end_date)
  end

感谢所有帮助,并让我排除了我的代码所在的位置。