Ruby on rails 4 连接多个方法和范围的Rails
My 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"
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])把查询搞砸了。ARlimit
和offset
方法。如果需要进一步调试,请尝试逐个添加它们。