所有者财产的默认订单

时间:2019-07-09 04:39:41

标签: ruby-on-rails ruby activerecord

我有一个购物篮,里面装有物品。我的课程是 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。)

谢谢!

1 个答案:

答案 0 :(得分:1)

离开Mike Heft的注释并整理一下语法后,我最终得到了:

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

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

(这最终又被打乱了,因为上面的代码只是拉出产品的ID,然后按顺序返回它们。我在该级别上应用了相同的插科打...,但...仍然使它们被打乱了。因此,尽管我仍然必须弄清谁对什么负责,但这是一个简单的“ join()。order()”。)