【问题标题】:Rails - Select, join, and orderRails - 选择、加入和排序
【发布时间】:2015-01-08 11:58:34
【问题描述】:

我正在尝试对我的资产进行排序,以便它们根据用户数量以降序显示。此代码在 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 的出现方式:

【问题讨论】:

  • 您是否尝试将.to_sql 添加到您的 ActiveRecord 查询中?该方法将返回它创建的 SQL。这可能会帮助您找到来自 Rails 的查询和纯 SQL 查询之间的差异。此外,您写的似乎不起作用,您能具体说明一下吗?
  • .to_sql 的输出与我输入的 sql 代码完全相同。而且,ruby 代码似乎对资产的顺序没有任何影响。
  • 所以 Rails 中的结果没有像预期的那样排序? Rails 中的顺序是什么?
  • 您是否可能以某种方式重新排序视图层中的结果?
  • @San 原来是这样,是的。

标签: ruby-on-rails ruby postgresql join


【解决方案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")
}

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

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 2012-03-01
    • 2013-11-23
    • 2013-03-25
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多