rails sql найти модели, связанные с собой с разницей в атрибутах, превышающей порог - PullRequest
0 голосов
/ 10 мая 2019

У меня есть модель Person в рельсах, которая связана с ней:

class Person < ApplicationRecord
  has_many :children,
    class_name: "Person",
    foreign_key: :person_id

  belongs_to :mother,
    class_name: "Person",
    foreign_key: :person_id
end

У людей также есть атрибут age, представляющий их возраст в годах.Я бы хотел, чтобы запрос ActiveRecord или SQL обнаруживал всех людей с несоответствиями возраста ребенка и матери, которые превышают или равны 50 годам.

(Название модели здесь не совсем то, что я действительно использую вмое приложение. Я переименовал его, чтобы упростить описание проблемы. Однако для моего фактического запроса мне нужно будет знать, если абсолютное значение *1009* разницы в возрасте больше или равно 50 годам. Очевидно, что дети могут 'не может быть старше их матерей, поэтому аналогия там не держится.)

Я пробовал следующие и несколько вариантов, которые все рушатся:

    Person
      .includes(:mother)
      .where("ABS(persons.age - (SELECT age FROM persons WHERE (id = persons.person_id))) >= 50")

Этот, в частности, приводит кс подсказкой:

HINT: No operator matches the given name and argument types. You might need to add explicit type casts.

Сначала я подумал, что, возможно, последнее предложение SQL-запроса where возвращает какой-то список возрастов, а не только возраст матери, поэтому япопытался подписаться с [1] после него, чтобы получить первый элемент (что должно быть) одного элемента массива (если моя гипотеза была верна).Это было не правильно - ошибка SQL затем обновилась, чтобы сообщить мне, что я не могу подписать что-то, что не является массивом.

Я ищу простейшее решение.Любая помощь приветствуется.Спасибо!

1 Ответ

1 голос
/ 10 мая 2019

Не в состоянии проверить это, но я верю, что реалс генерирует псевдонимы для вас на лету.

Попробуйте

Person
      .includes(:mother)
      .where("ABS(persons.age - (SELECT age FROM mothers_persons)) >= 50")

Обычно это имя ассоциации множественное, подчеркивание, имя таблицы (таким образом, если у пользователей есть сотрудники, соответствующая таблица (псевдоним) сотрудников пользователя называется employees_users

Если вышеприведенное не сработает, вам потребуется создать псевдонимы вручную в вызове SQL.

...