Самый чистый способ реализации логики условного представления в приложении - PullRequest
2 голосов
/ 03 ноября 2011

Я разрабатываю приложение, в котором пользователь выбирает из списка продуктов и добавляет их в корзину. Услуги будут представлены пользователю, сгруппированному по категориям.

Не всегда отображается один и тот же список товаров и категорий. Они могут меняться день ото дня.

Все в порядке, хитрая часть заключается в том, что есть определенное количество категорий, которые при отображении должны слегка изменить поведение приложения.

Например, допустим, у нас есть 3 категории, категории A, B и C. Любая категория времени B отображается тогда, она должна появиться на экране над категорией A. Каждый раз, когда пользователь выбирает продукт из категории B, он также должен выбрать продукт из категории C. Ни одно из этих правил не применяется, если категория B. не отображается.

Следует отметить, что список служб и категорий поступает от сторонних веб-служб, поэтому возможности добавления или изменения столбцов базы данных ограничены.

Какой самый чистый способ реализации такой логики?

1 Ответ

1 голос
/ 03 ноября 2011

Большая часть этого может быть отсортирована в контроллере или модели.

Итак: логика о том, какие категории отображать над какими другими категориями, это просто порядок сортировки по категориям, да? Таким образом, вы можете оставить «столбец сортировки» в модели категории и отсортировать их по этому полю.

«Должен выбрать один из них, если выбран один из них» является более сложным - но определенно проверка на основе модели. Я полагаю, у вас есть какая-то модель "заказа", чтобы хранить вещи, которые пользователь положил в свою корзину? Добавьте метод проверки, который выглядит примерно так:

validate :product_b_and_product_c

def product_b_and_product_c
  if self.products.any? {|p| p.category == 'category_b' }
    errors.add_to_base "must choose product from cat C if you have one in cat B" unless self.products.any? {p| p.category == 'category_c' }
   end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...