我有三个相关的类:Item
可以要求完成任意数量的WorkCenters
才能完成Item
,而StatusUpdate
用于记录Item
的{{1}}完成后。
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
我正在尝试生成一个kanban board,该列表包含每个包含class Routing < ApplicationRecord
belongs_to :item
belongs_to :work_center
...
end
的{{1}}的列表。每个WorkCenter
仅应存在于一个列表中,并且应包含在Items
属性最低的Item
中,而该属性没有包含该{{1}的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
中,然后我需要以某种方式确定{{1}在哪个列表中}。
修改1/1/19:
我可以使用以下内容构建work_center_id
和StatusUpdate
的哈希值:
work_center_id
但是,我希望所有这些都在一个查询中完成,而不是每个Items
一次。它还为尚未完成的每个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
的{{1}最低}。