Как получить списки элементов, сгруппированных по WorkCenter с наименьшим значением? - PullRequest
0 голосов
/ 01 января 2019

У меня есть три связанных класса: для Item может потребоваться заполнить любое число WorkCenters для завершения Item, а StatusUpdate используется для записи, когда Item 's WorkCenter завершено.

class Item < ApplicationRecord
  has_many :status_updates, dependent: :destroy
  has_many :routings,       dependent: :destroy
  has_many :work_centers,   through: :routings
  ...
end
class WorkCenter < ApplicationRecord
  has_many :status_updates, dependent: :destroy
  has_many :routings,       dependent: :destroy
  has_many :items,          through: :routings
  ...
end
class Routing < ApplicationRecord
  belongs_to :item
  belongs_to :work_center
  ...
end

Я пытаюсь сгенерировать доску канбан , в которой есть список для каждой WorkCenter, содержащей Items.Каждый Item должен существовать только в одном списке, и он должен содержаться в WorkCenter с самым низким атрибутом sequence, у которого нет StatusUpdate, содержащего эти Item и WorkCenter.

Я могу получить список незавершенных WorkCenters для данного Item, используя:

WorkCenter.where('id NOT IN (SELECT work_center_id 
                             FROM status_updates 
                             WHERE item_id = ?)', item.id)
          .where('id IN (SELECT work_center_id 
                         FROM routings 
                         WHERE item_id = ?)', item.id)

, но я не уверен, как обойти это.Похоже, я хочу Routings, где work_center_id не находится ни в каком StatusUpdate, сгруппированном по work_center_id, и затем каким-то образом мне нужно определить, к какому списку принадлежит Items.1036 * Редактировать 01.01.19: Я могу создать хэш WorkCenters и Items со следующим:

@wc_items = HashWithIndifferentAccess.new
WorkCenter.all.each do |wc|
  @wc_items[wc.id] = Item.where('id IN (SELECT item_id 
                                        FROM routings 
                                        WHERE work_center_id = ?)', wc.id)
                         .where('id NOT IN (SELECT item_id 
                                            FROM status_updates 
                                            WHERE work_center_id = ?)', wc.id)
end

Однако я бы хотел, чтобы все было сделано за один раззапрос вместо одного за WorkCenter.Он также включает Item для каждого WorkCenter, который еще не был завершен, но Item должен появляться только в одном списке (WorkCenter с самым низким sequence).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...