首页 > 解决方案 > 所有者财产的默认顺序

问题描述

我有一个购物篮,里面有物品。我的课是BasketItem < ActiveRecord::Base

一个 BasketItem belongs_to :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) 我如何把我的 CASE 放在那里?3)我如何将其设为默认值?(如果它不是 default_scope。)

谢谢!

标签: ruby-on-railsrubyactiverecord

解决方案


离开 Mike Heft 的评论并稍微清理一下语法,我最终得到:

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

这创建了一个 SQL 查询,它以正确的顺序返回事物。

(这最终又被打乱了,因为上面的代码只是提取产品的 ID,并按顺序返回它们。我在那个级别应用了相同的噱头......仍然让它们被打乱。所以,虽然我还是要分清谁负责什么,就是一个简单的“join().order()”。)


推荐阅读