首页 > 解决方案 > 将 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 中执行它。

标签: sqlruby-on-railsrubyactiverecord

解决方案


看看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
)

推荐阅读