sql - 将 SQL 查询转换为 Activerecord 查询
问题描述
如何将其转换为活动记录查询?
@test = @keyword_list.find_by_sql("
SELECT keywords.keyword, minimum_ranking.min_position from keywords
JOIN (select keyword_id, min(position) as min_position from rankings group by keyword_id) minimum_ranking
on minimum_ranking.keyword_id = keywords.id
where created_at between ('2019-10-15 07:00:00') AND ('#{date}')
")
不仅在这些代码之前,我已经有 2 层关联
@project = Project.find(params[:id])
@keywords = @project.keywords
@pagy, @keyword_list = pagy(@keywords.includes(:rankings).order(current_ranking: :asc), items: 50)
目前我一直在视图上运行循环和 .where ,这使得加载页面非常缓慢。我试图通过在控制器中进行单个 sql 查询来解决这个问题,设法在 sql 中编写它,但无法在 Active Record 中执行它。
解决方案
看看https://scuttle.io开始:
Keyword.select(
[
Keyword.arel_table[:keyword], MinimumRanking.arel_table[:min_position]
]
).where(
Arel::Nodes::Between.new(
:created_at, (
Arel::Nodes::Group.new(LITERAL<'2019-10-15 07:00:00'>)
).and(Arel::Nodes::Group.new(LITERAL<'#{date}'>))
)
).joins(
Keyword.arel_table.join(Ranking.arel_table).on(
MinimumRanking.arel_table[:keyword_id].eq(Keyword.arel_table[:id])
).join_sources
)
推荐阅读
- php - Laravel Collection 方法 has() 和 contains() 的区别
- php - 在产品中添加自定义字段以显示在购物车、结帐和订单中
- html - 两个带有文本的按钮图像(一个在顶部,第二个在底部)
- java - 更新 JComponent 容器内的项目
- excel - 更改某些单元格文本的颜色:不一致的宏行为
- swift - 使用 swift 查询 firebase 快照
- reactjs - 如何在 React Native 中的 firebase 服务函数成功后运行回调函数
- c# - 如果数据事务仍未关闭以进行打开的插入操作,是否可以使用数据?
- android - 在 Playstore Publish 中为 SEND_SMS 权限选择哪个检查选项?
- html - 根据表格的年龄显示表格的性别和字体颜色