Как отключить элементы в сетке
У меня есть несколько сеток, которые отображают данные на основе данного фильтра (в веб-приложении с использованием REST Api). Отображаемая структура данных всегда одинакова (для упрощения проблемы), но в зависимости от экрана, на котором находится пользователь, отображаемые результаты различаются.
Кроме того, и это проблема, некоторые результаты должны быть отключены, чтобы пользователь не мог их выбрать.
Пример: Foo имеет N баров. Если я хочу добавить нового отца (бара) к отцу (foo), я перехожу на экран поиска, но хочу, чтобы фильтрованная сетка показывалась как дети с ограниченными возможностями, которые уже связаны с отцом.
В настоящее время я контролирую эту проблему на сервере (запросы к базе данных), делая спецификаций присоединяется в зависимости от сценария и "отключение" результатов, которых я не хочу. Но этот подход приводит к тому, что я не могу повторно использовать запросы (из-за специфических объединений. Возможно, мне нужно искать Bars int order, связать их с другим отцом Baz, и я хочу отключить бары, которые уже связаны с текущим отцом...)
Другим подходом может быть следующее:
- Сохранить детей (только ids), связанных с отцом в массиве в памяти (javascript)
- В событии сетки "prerender" (или аналогичном) проверьте для каждого элемента, содержится ли он в предыдущем массиве или нет (поиск по id). Если это так, отметьте его как отключенный (например).
Это многоразовое решение на стороне клиента, и я всегда могу повторно использовать один и тот же запрос на стороне сервера.
Прежде чем приступать к реализации этого решения, я хотел бы знать, есть ли лучший вариант.
Я уверен, что это повторяющаяся проблема, и я не хочу изобретать велосипед.
Любая стратегия или предложение?
Изменить: показать пример:
Предполагая эту модель:
Category N:M Item
SalesPromotion N:M Item
У меня есть два разных экрана: один из них относится к одной категории, а другой - к одной рекламной акции. На каждом экране я могу искать элементы и добавлять их в категорию или SalesPromotion. Но когда я ищу элементы, я хочу, чтобы элементы, которые уже относятся к категории /SalesPromotion, отображаются как отключенные (или не показаны, для простоты в этом примере).
Я могу сделать это на сервере, выполняя такие запросы:
-- Query for search Items in Category screen
SELECT * FROM ITEMS i
LEFT JOIN ItemsCategories ic on ic.ItemId = i.ItemId
WHERE ic.CategoryId IS NULL OR ic.CategoryId <> @CurrentCategoryId
-- Query for search Items in SalesPromotion screen
SELECT * FROM ITEMS i
LEFT JOIN ItemsSalesPromotions isp on isp.ItemId= i.ItemId
WHERE isp.PromotionId IS NULL OR isp.PromotionId <> @CurrentPromotionId
Вы можете себе представить, что произойдет, если у меня будет все больше и больше таких сценариев (с более сложной моделью и запросами, конечно).
Возможна одна альтернатива:
- Сохранять элементы, которые уже принадлежат текущей категории /SalesPromotion в памяти (javascript, clientside).
- В событии сетки prerender (или эквиваленте) на клиенте определите, какие элементы должны быть отключены (путем поиска каждой строки в сохраненных элементах).
Итак, мой вопрос заключается в том, что этот подход является хорошим решением или есть хорошо известное решение этой проблемы (я так думаю).
Ответы
Ответ 1
я изменил свой ответ на основе комментария op
поэтому у вас в основном есть два варианта.
- удалите сервер Ids после запроса db. (влияет на производительность реакции, но более безопасно).
- сделать это на стороне клиента с помощью js и удалить их из сетки.
Ответ 2
В SELECT
s часть LEFT JOIN
бесполезна. В вашем выражении WHERE
используется таблица ITEMS
, поэтому она не влияет на набор возвращаемых строк, а так как в другой таблице нет соответствующей строки, столбцы для этой другой таблицы - все NULL
.
Таким образом, вы можете иметь единственный SELECT * FROM ITEMS i
(+ фильтр) и настраивать свой пользовательский интерфейс на основе столбцов CategoryId
, PromotionId
и т.д. NULL
.