Как найти только тех пользователей, которые разместили хотя бы один комментарий - PullRequest
4 голосов
/ 18 января 2010

Я использую Rails 2.3.5.

Это стандартный случай. Таблицы: пользователи, комментарии, комментарии пользователя. Мне нужно найти всех пользователей, которые имеют статус «активный» и оставили хотя бы один комментарий.

Я знаю, что таблица комментариев может иметь внешний ключ, но это надуманный пример. В таблице два пользователя. Есть два комментария. Оба комментария опубликованы первым пользователем.

named_scope :with_atleast_one_comment, lambda { {
      :joins => 'inner join user_comments on users.id = user_comments.user_id ' } }


 named_scope :with_active_status, {:conditions => {:status => 'active'} }    

Когда я выполню

 User.with_atleast_one_comment.with_active_status 

Я получил две записи. Поскольку оба комментария опубликованы одним пользователем, я хочу, чтобы только один пользователь.

Что за исправление?

Ответы [ 3 ]

5 голосов
/ 19 января 2010

Область действия with_at_least_one_comment не работает так, как вы ожидаете. Как видно из вопроса, он выберет пользователя для каждой записи в user_comments. Что приводит к дублирующим результатам, которые вы видите. При компоновке с active_users вы удалите все записи, возвращаемые with_at_least_one_comment, которые не имеют активного статуса.

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

Короче говоря, эта именованная область будет делать именно то, что вы хотите.

named_scope :with_at_least_one_comment, :joins => :user_comments, 
  :group => 'users.id'
0 голосов
/ 19 января 2010

если я не ошибаюсь, есть несколько способов добиться этого ...разве что User.comments?или другой способ также указать новый метод в вашем контроллере и, наконец, ...информация от Emfi должна работать, попробуйте для этого ~

0 голосов
/ 18 января 2010

Укажите параметр: uniq => true, чтобы удалить дубликаты из коллекции.Это наиболее полезно в сочетании с опцией: through.

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