Rails - 选择,加入和订购

时间:2014-11-11 19:53:17

标签: ruby-on-rails ruby postgresql join

我正在尝试订购我的资产,以便它们根据用户数量按降序显示。这段代码适用于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

我希望所有黄色资产都位于顶部,当用户填写在下方时。

Screenshot of Problem

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的出现方式:

Screenshot of Postgres

1 个答案:

答案 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")
}

谢谢你们指导我朝着正确的方向前进。