Rails 3, активная запись.Как получить объект из его вложенных значений - PullRequest
1 голос
/ 29 июня 2011

Я использую Postgres и у меня (рабочий) SQL выглядит примерно так:

SELECT 
distinct(users.id),
users.*
FROM 
public.addons, 
public.containers, 
public.users
WHERE 
( (addons."value" = 'Something' AND addons."name" = 'bob') OR
addons."value" = 'Something else' AND addons."name" = 'bill') AND 
(containers.id = addons.site_id AND 
users.id = containers.user_id)

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

@users = User.find(:include => [:users, :containers, :addons], :conditions => {( (addons."value" = 'Something' AND addons."name" = 'bob') OR
    addons."value" = 'Something else' AND addons."name" = 'bill') AND 
    (containers.id = addons.site_id AND 
    users.id = containers.user_id) } )

Возможно ли это вообще?

1 Ответ

2 голосов
/ 29 июня 2011

Во-первых, вы должны понимать, что DISTINCT - это не функция, а модификатор запроса.Скобки не меняют это.DISTINCT означает, что если есть строки, в которых каждый возвращенный столбец идентичен, уменьшите дубликаты до одной строки.Вы не можете сократить до одной строки на отдельное значение в одном столбце (это задача GROUP BY).

Во-вторых, наборы результатов SQL правильно имеют одно значение на строку на столбец.Вы можете выполнить какую-либо агрегированную конкатенацию строк, такую ​​как MySQL GROUP_CONCAT, или эквивалентную агрегатную функцию в PostgreSQL , но затем вы получите строку, объединяющую все значения, которые затем вам нужно будет взорвать в Rubyкод после извлечения.

Так что, если у вас есть несколько строк для выборки для данного users.id, просто дайте им вернуться в приложение в несколько строк.Затем выполните некоторую последующую обработку данных в вашем приложении.Цикл извлечения строк и добавление атрибутов к объекту Ruby один за другим.Если вы извлекаете данные для нескольких идентификаторов пользователей в данном запросе, вставьте атрибуты в хэш ваших пользовательских объектов, используя ключ идентификатора пользователя.Таким образом, вам не нужно извлекать строки в каком-либо определенном порядке.

В-третьих, из ваших столбцов "name" и "value" я делаю вывод, что вы используете Entity-Attribute-Значение дизайн, где пользователи имеют несколько атрибутов, по одному на строку.Это проект, который подрывает традиционный реляционный доступ к данным, поэтому вам в конечном итоге придется писать код приложения для предварительной и последующей обработки данных.Если бы вы могли поместить каждый атрибут в свой собственный обычный столбец, который был бы реляционным способом хранения данных, ваши запросы SQL были бы намного проще.

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