Порядок по умолчанию на собственность владельца - PullRequest
0 голосов
/ 09 июля 2019

У меня есть корзина, в которой есть товары. Мой класс BasketItem .

Элемент BasketItem принадлежит_: item .

Item имеет много item_tags . Он также имеет много тегов от до item_tags .

Для тегов установлено значение ключа. Ключом могут быть такие вещи, как «цена», «скоропортящиеся», «продукты» и т. Д. Ключ «продукты» имеет такие значения, как «цитрусовые», «ягодные фрукты», «дыня», «овощ», «корень» , "грибок" и т. д.

При извлечении корзины я хочу, чтобы предметы возвращались в порядке по умолчанию: все фрукты, грибок, а затем все остальное.

В SQL я бы сделал свои объединения и затем добавил:

ORDER BY (
   CASE
   WHEN tags.value LIKE '%fruit%' THEN 0
   WHEN tags.value = 'Vegetable' THEN 1
   ELSE 2
   END)

Я пробовал:

has_many :tags, through: :produce

с областью действия по умолчанию:

default_scope { order(tags: :desc) }

Просто чтобы посмотреть, смогу ли я получить доступ к тегам, чего я не могу. На самом деле, если посмотреть на генерирование SQL, оно прямо вытягивает из basket_items без соединений.

1) Так как мне оформить заказ в отношении этого тега? 2) Как я могу получить мой случай там? 3) И как мне сделать это по умолчанию? (Если это не default_scope.)

Спасибо!

1 Ответ

1 голос
/ 11 июля 2019

Отойдя от комментария Майка Хефта и немного очистив синтаксис, я получил:

default_scope {joins(:tags).order("CASE WHEN tags.name LIKE ...")}

И это создало SQL-запрос, который возвращает вещи в правильном порядке.

(В итоге это снова зашифровано, потому что приведенный выше код просто извлекает идентификаторы для продукта и возвращает их в указанном порядке. Я применил ту же затычку на этом уровне и ... все равно получил их зашифрованные. ? Так что, хотя мне еще предстоит разобраться, кто за что отвечает, это был простой «join (). Order ()».)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...