【问题标题】:How to group an object by its associated model when using a has_many :through relationship in rails?使用has_many时如何通过关联模型对对象进行分组:rails中的关系?
【发布时间】:2013-08-01 19:48:11
【问题描述】:

我正在开发一个应用程序,帮助当地餐馆跟踪每天的工作时间。用户在每个班次结束时通过称为“结帐”的模型输入数据。他们选择与has_many :through => employment 关联的员工,其中雇佣模型是一个连接表。当然,Checkout 是一个令人困惑的术语,但这正是餐厅想要使用的 DSL。

您如何将每位员工在某一天的工作时间分组?当天,该员工的数据库中可能有 2 次结账——一份来自午餐,一份来自晚餐。

我想创建每个员工在给定日期工作的小时数列表,当他们从那天起的小时数可能存储在数据库中的单独结帐中。

Today's Date
Joe Employee
Hours worked: 12

Jill Employee
Hours worked: 4

etc.

当结账不是结账模型的属性而是通过我的雇佣模型关联时,我如何按员工对结账进行分组?本质上,我试图在我的报告助手中做这样的事情:

def checkouts_today
  current_user.checkouts.where( :date => Date.today )
end

def employee_hours_today
  checkouts_today.where( :employment => Employee.find_by(id: params[:id]) ).sum(:hours)
end

但我无法让它与 has_many :through 关联一起使用。我只能算出如何计算当天的所有小时数,而不是每个员工的总小时数。

以下是相关文件:

更新: 我可以遍历每个员工并显示他们的结帐:

<% @employees.each do |employee| %>
    <% if employee.checkouts.present? %>
        <p><%= employee.full_name %></p>

        <% employee.checkouts.each do |checkout| %>
            <%= checkout.date %>
            <%= checkout.shift %>
            <%= checkout.hours %>
        <% end %>
    <% end %>
<% end %>

但是,我不知道如何汇总他们的小时数并在一个块中显示和返回。它返回每个员工姓名下每天的每个结帐。这种逻辑似乎也不应该出现在视图中。

【问题讨论】:

  • 我应该使用组方法来执行此操作吗?还是遍历每个员工并显示他们的结账时间?
  • 你需要在一行中显示员工的姓名和他的结账时间?
  • 我只需要计算员工在某一天的工作时间。但是在任何一天都可能与该员工进行多次结账。员工和结帐与 has_many :through 相关联。我编辑了原始帖子,因为格式令人困惑。
  • 为什么 .sum(:hours) 不起作用?
  • 我的意思是你得到一个员工一天的所有结账,然后只是总结这些结账的时间。想通过Teamviewer在你的控制台上玩,谁知道,我可能会解决它:)

标签: ruby-on-rails activerecord associations ruby-on-rails-4 has-many-through


【解决方案1】:

第一种方法

checkout.rb 中:

scope :checkouts_today, -> {where(date: Date.today)}

在您的视图或控制器中:

employee.checkouts.checkouts_today.sum(:hours)

第二种方法

employee.rb

has_many :today_checkouts, class_name: "Checkout", conditions: {date: Date.today}

在您的视图或控制器中:

employee.today_checkouts.sum(:hours)

不确定第二种方法是否可行,因为您有一个连接表来获取EmployeeCheckout 之间的关系。正如我们在聊天中讨论的那样,您可以删除连接表,在您的情况下,我看不到您需要它的位置,给您的应用更多空间。

【讨论】:

  • rmagnum2002,我仍在尝试解决这个问题。别担心,我肯定会接受你的回答,但是如果我把它移到“报告”模型中,你会如何做同样的事情。似乎这应该从员工或结帐中提取到一个新模型中,以生成“员工今天工作时间”等报告。
  • 请参阅上面的聊天,了解如何解决这个问题的完整记录。感谢 rmagnum2002
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 1970-01-01
  • 2010-11-02
  • 2015-09-04
  • 2013-03-28
  • 2011-09-26
  • 2021-03-20
相关资源
最近更新 更多