【问题标题】:Can I Order Results Using Two Columns from Different Tables?我可以使用来自不同表的两列来订购结果吗?
【发布时间】:2016-01-14 17:54:19
【问题描述】:

我有一个 Rails 应用程序,其中包含美国的一个城市。我正在开发一个数据库流程,该流程将以付费进入网站的企业为特色。其目标是在距城市位置一小时车程的范围内展示企业,以使游客了解可用的东西。我的目标是按城市对企业进行分组,首先列出该城市的企业,然后显示下一个最近城市的企业。我希望城市按距离列出,城市组内的企业按企业名称列出。

我有两个表要加入以完成此操作。

city (has_many :businesses) - name, distance

business (belongs_to :city) - name, city_id, other columns

我知道我可以执行类似于下面的语句的操作,它应该只显示城市行存在业务行的数据。

@businesses = City.order(“distance ASC").joins('JOIN businesses ON businesses.city_id = cities.id')

我想按businesss.name 添加订单。我看过一个示例 ORDER BY a.Date, p.title,它引用了来自两个数据库的列。

ORDER BY a.Date, p.title

我可以在现有语句中添加代码以按名称对企业进行排序,还是必须嵌入 SQL 代码才能执行此操作?我已经看到其他数据库这样做的示例,但答案不是 Rails 特定的,或者没有使用 PostgreSQL。

【问题讨论】:

  • 具有多个排序列的 ORDER BY 不是 Postgres 特定的。 City.order(“distance ASC, businesses.name").joins(:businesses) 应该可以工作。您似乎没有尝试过它是否有效?!请在此处询问之前尝试一下。
  • @Raffael 过去几年我在这个论坛上提交了 89 个问题。我尽我所能尝试事情并按照指导方针进行研究。如果我想出一些可以尝试的东西,我会在发布我的问题之前尝试一下。这是我在数小时的在线研究后无法考虑尝试的一次。顺便说一句,您的解决方案没有找到任何记录。我将继续使用我的代码并希望找到解决方案。
  • 我忘记在我的模型中包含正确的关系并且数据存在于我的表中。当我显示业务行时,屏幕上会显示正确的城市名称。
  • 抱歉这么无情。估计我累了。很高兴您找到了适合您的解决方案!让我给你两个可能对未来有帮助的建议:to_sqlmerge 关系方法。
  • @Raffael 可能会在您疲倦或饥饿时发生。接受道歉。由于您发布的内容我不知道,因此我正在保存此问题的链接。您建议的 .joins 子句(我从未使用过)在我只需要使用 .pluck 访问几列的其他情况下很有用。感谢其他建议。

标签: ruby-on-rails postgresql join


【解决方案1】:

经过更多的研究,我终于能够按照我想要的方式让它工作。

使用 .joins(:businesses) 没有产生任何结果,因为它只包含 City aka BusinessCity 的列,而没有 Business 的列。我发现您必须使用.pluck.select 才能访问要加入的表中的列。这是我不想做的事情,因为我预计将来会添加更多列。

我最终将 Business 作为主表而不是 BusinessCity 作为我的起点,因为我在我最初的问题中所述的视图中列出了 Business 中的数据。当我这样做时,我无法使用.joins(:business_cities) 子句,因为它表示该关系不存在。我决定回到最初使用 Business 作为主表的方式。

我想出了以下语句,它提供了两个表中的所有列,这些列在 BusinessCity 表上按距离排序,在 Business 表上按名称排序。我成功地根据需要添加了.where 子句,以适应我的视图中的搜索功能。

@businesses = Business.joins("JOIN business_cities ON business_cities.id = businesses.business_city_id").order("business_cities.distance, businesses.name")

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 2012-06-30
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2013-09-21
    • 2019-04-19
    相关资源
    最近更新 更多