Пользовательский объединенный SQL к ActiveRecord - PullRequest
0 голосов
/ 14 сентября 2018

БД - PostgreSQL Рельсы - 4

У меня следующий SQL

sql = <<-SQL
  LEFT OUTER JOIN (
    SELECT SUM(id) AS sum_ids, some_key FROM second_models
    WHERE id < 10000
    GROUP BY some_key
  ) AS second_models ON first_models.id = second_models.first_model_id
SQL
record = FModel.joins(sql).last

record.sum_ids # DOESN'T WORK !

и я могу видеть запись как объект ActiveRecord, но можно ли как-то получить поле sum_ids, которое было построено вручную?

1 Ответ

0 голосов
/ 14 сентября 2018

Дополнительное поле находится внутри секции соединения.Он не выбран по умолчанию и поэтому не может быть прочитан.При выполнении вашего оператора вы получите что-то вроде следующего SQL-запроса:

SELECT first_models.*
FROM first_models
  INNER JOIN (
    SELECT SUM(id) AS sum_ids, some_key
    FROM second_models
    WHERE id < 10000
    GROUP BY some_key
  ) AS second_models
  ON first_models.id = second_models.first_model_id

Первый оператор выбора предотвращает доступность поля sum_ids в вашем объекте, поскольку оно никогда не возвращается в Rails.Вы хотите изменить SELECT first_models.* на SELECT *.Это просто делается путем указания следующего выбора:

record = FModel.select(Arel.star).joins(sql).last
record.sum_ids
#=> should now give you your value

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

f_models = FModel.arel_table
record = FModel.select(f_models[Arel.star]).select('sum_ids').joins(sql).last

Это должно привести к SELECT first_models.*, sum_ids.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...