Rails: как показать элементы, только если создатель уникален?

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

Теперь я хочу получить только один элемент на пользователя.

@projects = проект.все.где (user_id уникален)

То есть проект должен быть извлечен, только если ни один другой проект от того же пользователя не был извлечен уже.

Надеюсь, я был ясен с моим вопросом. I am on Rails 5.

РЕДАКТИРОВАТЬ:

Я использую postgres в производстве.

2 ответа

  1. Есть много способов сделать это. Я бы рекомендовал следующий код в качестве отправной точки:

    projects_scope = Project.where(:status => "Published")
    @projects = projects_scope.where(id: projects_scope.group(:user_id).maximum(:id).values)
    

    Вот как это работает:

    1. Мы будем использовать область опубликованных проектов дважды, поэтому мы назначаем ее переменной, чтобы сделать ее более читаемой.
    2. Мы группируем проекты user_idи используемmaximum, чтобы выбрать один с самым высоким идентификатором (вы можете использовать minimumили любой другой rmethod выбора одной строки из группы). Более подробный:

      a. projects_scope.group(:user_id).maximum(:id)возвращает Hashсопоставление идентификаторов пользователей с идентификаторами проектов. Например { 12 => 17, 14 => 3 }средства для пользователя 12выбираем проект17, а для пользователя 14выбираем проект 3.
      b. Нас интересуют только идентификаторы проектов, поэтому мы получаем значения в хэше, вызываяHash#values).

    3. Зная идентификаторы, мы запрашиваем базу данных для соответствующих проектов и назначаем результат @projects.

    Если вы хотите узнать некоторые более продвинутые методы, я рекомендую вам взглянуть на этот вопрос переполнения стека .