Вот моя базовая модель иерархия:Rails сложных соединения запроса
class Product
has_many :inventories
end
class Inventory
belongs_to :product
has_many :inventory_events
end
class InventoryEvent
belongs_to :inventory
end
InventoryEvent экземпляры магазин изменение состояния + метки время для этих изменений, так inventory.inventory_events.last
показывает текущее состояние.
У меня возникают проблемы с созданием запроса в модели продукта, который даст мне все запасы, текущее состояние которых составляет received
.
То, что я прямо сейчас:
p = Product.first
p.inventories.joins(:inventory_events).where(inventory_events: {state: 'received'}).all
=> # Here I get back all Inventory that ever had the state 'received' but may
not currently be 'received'.
My SQL знание довольно ограниченно, но кажется, что какое-то предел для inventory_events: {}
опции может работать, но не нашел способ сделать это.
Редактировать: Вот мое обходное решение на данный момент, чтобы показать свою конечную цель. Надеюсь, есть способ моделировать такой запрос.
class Inventory
def self.received_items
includes(:inventory_events).select {|i| i.current_state == 'received'}
end
def current_state
inventory_events.last.state
end
end
Product.first.inventories.received_items
=> # Here I get the correct array of inventories
Я не думаю, что это идеальный ... но вы можете добавить 'HAS_MANY: inventory_events, через:: inventories' к модели продукта, а затем попробуйте 'p.inventory_events.where (state: 'received'). last.inventory'. Это, по крайней мере, правильное понимание проблемы? – pdobb
@pdobb Ты в шаге. Однако это приведет только к возврату макс. 1 инвентаря. Позвольте мне подробно остановиться на идее: у продукта может быть 5 инвентарей, и у каждого инвентаря может быть 3 инвентаря, но только последний хронологический инвентарь_вент считается текущим состоянием инвентаря. Так, например, p.inventories.received_items должен возвращать все инвентаризации с последним инвентарным_эвентом.state == 'received'. Возможно, он возвращает 3 инвентаря здесь. –
@pdobb Я только что добавил раздел редактирования выше, чтобы показать свою текущую работу, которая должна лучше проиллюстрировать мою цель здесь. –