У меня есть три связанных класса: для 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
).