2015-06-01 2 views
2

Мои рельсы приложение предоставляет список услуг, которые определяются следующим образом:Rails присоединяющиеся несколько методов и областей применения

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_translation метод стремится загружая переводы для (имя, контент и т. д.) и область with_clients гарантирует, что услуги упорядочены по количеству связанных клиентов (также, если ни один клиент не связан с сервисом, услуга не отображается)

Оба метода работают, когда называют отдельно в моем services_controller:

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 

Все хорошо и денди, но мне нужны оба этих методов совместной работы, так что, когда я делаю это:

@services = Service.with_clients.with_translation(@lang).page(params[:page]) 

Я получаю сообщение об ошибке:

PG :: Ошибка: ОШИБКА: колонка "clients_count" не ExI st LINE 1: SELECT DISTINCT "services". "id", clients_count AS alias_0 F ...

Я попытался объединить два метода, создав весь запрос в контроллере, как зря ... любая помощь быть оцененным!

+1

Вы уверены, что 'with_translation' является методом экземпляра? Можете ли вы предоставить полный журнал? Также вы можете предоставить журналы SQL при вызове областей отдельно? –

ответ

1

Ошибка указывает, что выходной запрос содержит clients_count в качестве столбца, но это просто псевдоним для COUNT.

Попробуйте запустить областей в rails console и анализа запросов в журнале по одному:

вы говорите, что это работает

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 
+0

Отладка в консоли rails помогла мне решить проблему. Благодаря! :) Мне нужно было добавить «service_translations.id» в качестве параметра в групповом вызове, и он сработал. То, что вызвало проблему, - Каминари. Его метод .page (params [: id]) испортил запрос. –

+0

[Kaminari использует] (https://github.com/amatsuda/kaminari/blob/0c354253a352150d3f2b7f7527066a8a9f64ff6d/lib/kaminari/models/mongoid_extension.rb#L10) Методы AR 'limit' и' offset'. Попробуйте добавить их один за другим, чтобы отлаживать, если в дальнейшем. –

Смежные вопросы