我有一个购物篮,里面装有物品。我的课程是 BasketItem
BasketItem 属于:项目。
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。)
谢谢!
答案 0 :(得分:1)
离开Mike Heft的注释并整理一下语法后,我最终得到了:
default_scope {joins(:tags).order("CASE WHEN tags.name LIKE ...")}
然后创建了一个SQL查询,该查询以正确的顺序返回事物。
(这最终又被打乱了,因为上面的代码只是拉出产品的ID,然后按顺序返回它们。我在该级别上应用了相同的插科打...,但...仍然使它们被打乱了。因此,尽管我仍然必须弄清谁对什么负责,但这是一个简单的“ join()。order()”。)