Intereting Posts
Какой SQL-запрос более безопасен с точки зрения SQL-инъекции Экспорт Blob из базы данных MySQL в файл только с SQL Вычисляемые столбцы в временных окнах Azure SQL Server 2016 получить результат запроса sql в формате таблицы Насколько быстрее используется timestamp, чем столбец datetime в MySQL? Чистый способ экстернализации длинных (+20 строк sql) при использовании весны jdbc? Неверное обслуживание в Apache Tomcat WebService Является ли «класс SQL-помощников» в Microsoft Application Blocks для .NET отличным? Как сделать строку целым числом и иметь 0 в случае ошибки в трансляции с PostgreSQL? Избегайте SQL-инъекций по запросу с помощью tablename Невозможно вставить несколько значений в DB2 с помощью UNION ALL и генерировать идентификаторы из последовательности SQL-'08: Являются ли несколько операторов Replace плохой практикой / есть ли другой способ написать этот запрос? Как сравнивать / передавать данные SQL rowversion SQL в C # Создание сводной таблицы с PostgreSQL Oracle DB вставляет и ничего не делает на дубликат ключа

Найти все записи, которые имеют счетчик больше нуля

Я пытаюсь сделать что-то, что я думал, что это будет просто, но, похоже, это не так.

У меня есть модель проекта, у которой много вакансий.

class Project < ActiveRecord::Base has_many :vacancies, :dependent => :destroy end 

Я хочу получить все проекты, в которых есть как минимум 1 вакансия. Я попробовал что-то вроде этого:

 Project.joins(:vacancies).where('count(vacancies) > 0') 

но это говорит

SQLite3::SQLException: no such column: vacancies: SELECT "projects".* FROM "projects" INNER JOIN "vacancies" ON "vacancies"."project_id" = "projects"."id" WHERE ("projects"."deleted_at" IS NULL) AND (count(vacancies) > 0) .

joins использует внутреннее соединение по умолчанию, поэтому использование Project.joins(:vacancies) будет фактически возвращать проекты, у которых есть связанная вакансия.

ОБНОВИТЬ:

Как отметил @mackskatz в комментарии, без предложения group , приведенный выше код вернет дублирующие проекты для проектов с несколькими вакансиями. Чтобы удалить дубликаты, используйте

 Project.joins(:vacancies).group('projects.id') 

1) Чтобы получить проекты с не менее чем одной вакансией:

 Project.joins(:vacancies).group('projects.id') 

2) Чтобы получить проекты с более чем одной вакансии:

 Project.joins(:vacancies).group('projects.id').having('count(project_id) > 1') 

3) Или, если модель Vacancy задает счетчик кеша:

 belongs_to :project, counter_cache: true 

то это тоже будет работать:

 Project.where('vacancies_count > ?', 1) 

Может потребоваться указать правило исключения для vacancy вручную ?

Да, vacancies не являются полем в объединении. Я считаю, что вы хотите:

 Project.joins(:vacancies).group("projects.id").having("count(vacancies.id)>0") 
 # None Project.joins(:vacancies).group('projects.id').having('count(vacancies) = 0') # Any Project.joins(:vacancies).group('projects.id').having('count(vacancies) > 0') # One Project.joins(:vacancies).group('projects.id').having('count(vacancies) = 1') # More than 1 Project.joins(:vacancies).group('projects.id').having('count(vacancies) > 1') 

Ошибка говорит вам, что вакансии не являются колонкой в ​​проектах, в основном.

Это должно работать

 Project.joins(:vacancies).where('COUNT(vacancies.project_id) > 0')