Ruby on rails 4 连接多个方法和范围的Rails

Ruby on rails 4 连接多个方法和范围的Rails,ruby-on-rails-4,activerecord,Ruby On Rails 4,Activerecord,My rails应用程序提供如下定义的服务列表: SELECT DISTINCT "services"."id", count(clients_services.service_id) AS clients_count FROM "services" INNER JOIN "clients_services" ON "clients_services"."service_id" = "services"."id" INNER JOIN "clients" ON "clients"."id"

My rails应用程序提供如下定义的服务列表:

SELECT  DISTINCT "services"."id", count(clients_services.service_id) AS clients_count FROM "services" 
INNER JOIN "clients_services" ON "clients_services"."service_id" = "services"."id" 
INNER JOIN "clients" ON "clients"."id" = "clients_services"."client_id" 
LEFT OUTER JOIN "service_translations" ON "service_translations"."service_id" = "services"."id" 
WHERE (service_translations.language_id=2) 
GROUP BY services.id
ORDER BY clients_count desc
service.rb

has_and_belongs_to_many :clients
has_many :translations, class_name: ServiceTranslation, dependent: :destroy

def with_translation(lang)
  includes(:translations)
      .where("service_translations.language_id=?", lang.id)
      .references(:service_translations)
end

scope :with_clients, -> { select("services.*, count(clients_services.service_id) as clients_count")
  .joins(:clients).group('services.id').order('clients_count desc') }
因此with_翻译方法急于加载服务的翻译(名称、内容等),with_客户端的作用域确保服务按链接客户端的数量排序(此外,如果没有客户端链接到服务,则服务不会显示)

在my services_controller中单独调用时,这两种方法都有效:

服务控制器.rb

class ServicesController < ApplicationController
  def index
    #@services = Service.with_clients.page(params[:page])
    #or
    @services = Service.with_translation(@lang).page(params[:page])
  end
end
我收到以下错误消息:

PG::错误:错误:“客户端计数”列不存在 第1行:选择不同的“服务”.“id”.客户端\u计为别名\u 0 F


我尝试合并这两种方法,在控制器中创建整个查询,但都没有成功……希望您能提供帮助

错误表明输出查询将
客户机\u count
作为一列,但它只是
count
的别名

尝试在
rails控制台中运行scopes
并逐个分析日志中的查询:

你说这样行吗

Service.with_clients
首先确保两个没有分页的作用域组合正确工作

Service.with_clients.with_translation(@lang)
结果查询应如下所示:

SELECT  DISTINCT "services"."id", count(clients_services.service_id) AS clients_count FROM "services" 
INNER JOIN "clients_services" ON "clients_services"."service_id" = "services"."id" 
INNER JOIN "clients" ON "clients"."id" = "clients_services"."client_id" 
LEFT OUTER JOIN "service_translations" ON "service_translations"."service_id" = "services"."id" 
WHERE (service_translations.language_id=2) 
GROUP BY services.id
ORDER BY clients_count desc

你确定
with_translation
是一种实例方法吗?你能提供完整的日志吗?另外,当您单独调用作用域时,是否可以提供SQL日志?rails控制台中的调试帮助我解决了这个问题。谢谢!:)我需要将“service_translations.id”作为参数添加到组调用中,它起到了作用。引起这一问题的是卡米纳里。它的method.page(params[:id])把查询搞砸了。AR
limit
offset
方法。如果需要进一步调试,请尝试逐个添加它们。