我正在尝试订购我的资产,以便它们根据用户数量按降序显示。这段代码适用于Postgres,但它似乎不适用于Ruby。不确定有什么问题。任何帮助表示赞赏。提前谢谢。
def order_assets
@asset = Asset.select("assets.id, count(assets_users.asset_id) as the_count")
.joins("LEFT OUTER JOIN assets_users ON assets.id = assets_users.asset_id")
.group("assets.id")
.having("count(*) > 0")
.order("the_count")
end
我希望所有黄色资产都位于顶部,当用户填写在下方时。
Postgres代码:
SELECT
assets.id,
count(assets_users.asset_id) as the_count
FROM assets
LEFT OUTER JOIN assets_users ON assets.id = assets_users.asset_id
GROUP BY assets.id
HAVING count(*) > 0
ORDER BY the_count;
这就是Postgres的出现方式:
答案 0 :(得分:1)
结束将所有内容移至资产模型。如果有人需要/想要它,将在答案的代码下发布该代码。
我首先将assets.id
切换为assets.*
,因为有一个asset_profile_id
参数未通过。我添加了.where
函数,以便查询知道从asset_profile
获取assets
。我添加的唯一另一件事是资产的额外订购,以便剩余部分将根据他们的ID号进行订购。
def set_assets
@assets = Asset.select("assets.*, count(assets_users.asset_id) as the_count").joins("LEFT OUTER JOIN assets_users ON assets.id = assets_users.asset_id").where(asset_profile_id: params[:id]).group("assets.id").having("count(*) > 0").order("the_count ASC, assets.id ASC")
end
我最终将代码移到资产模型中的范围:
scope :ordered_by_user_count, -> (profile_id) {
select("assets.*, count(assets_users.asset_id) as the_count")
.joins("LEFT OUTER JOIN assets_users ON assets.id = assets_users.asset_id")
.where(asset_profile_id: profile_id)
.group("assets.id")
.having("count(*) > 0")
.order("the_count ASC, assets.id ASC")
}
谢谢你们指导我朝着正确的方向前进。