【问题标题】:complex find SQL using active record to associate records from two different tables with has_many relationship复杂的查找 SQL 使用活动记录将来自两个不同表的记录与 has_many 关系相关联
【发布时间】:2012-10-21 21:48:18
【问题描述】:

我一直在网上寻找解决方案,但无济于事。我正在解决一个问题,我们在 has_many 关联中有两个表,这里是模型名称

 class Employee < ActiveRecord::Base     # main table stores all the employee details
       has_many :work_orders
       attributes :id, :name

 class WorkOrder < ActiveRecord::Base   # Work Orders are created by a form
       belongs_to :employee
       attributes :id, :work_details, :employee_id

软件规范是为工作订单创建一个表单,由一个单独的实体提及所有工作细节(假设是一个客户所以在保存表单细节时employee_id 为零)。此时,在将 WorkOrder 的详细信息保存在数据库中后,我们需要触发一个自动调度系统,该系统将按照以下顺序自动分配具有最少 work_order 数量的员工;

没有关联 WorkOrders 的员工(第一个条件,如果未找到则下一个)

拥有最少数量的相关工作订单的员工正在工作(或第二个条件)

我正在尝试使用活动记录将上述条件耦合到一个 FIND SQL 中,这将返回一个只有一个员工记录的集合,以便我们可以将employee.id 与 work_orders.employee_id 相关联这个新的工作订单。

我编写了一个管理面板来查找所有没有关联employee_id 的work_orders,并且可以通过手动提供employee.id(使用上述首选项)来使用下一个可用员工更新work_orders 记录,但我想在某种程度上自动执行此操作.

任何建议或伪代码会有帮助吗?

【问题讨论】:

    标签: ruby-on-rails-3 activerecord model associations single-table-inheritance


    【解决方案1】:

    select a.id, count(b.employee_id) from employees a left join work_orders b on a.id = b.employee_id group by a.id, b.employee_id order by count(a.id), a.id

    此查询将为您提供最少使用的员工。

    简单的翻译是:(根据您的要求添加您自己的订单) Employee.joins("left join work_orders on work_orders.employee_id = employees.id").group("employees.id, work_orders.employee_id")

    【讨论】:

    • 嘿,非常感谢,解决方案就在我眼前,你指出的非常清楚,似乎我在使用 find 方法时缺少组参数,现在查询我工作得很好跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多