Массив результатов с использованием Active Record Query Model 'select' и 'where' - PullRequest
2 голосов
/ 27 октября 2011

У меня есть пользователь, членство и модель группы. Пользователь имеет много членств и групп через членство. Группа имеет много членств и пользователей через членство. Членство принадлежит обоим.

Когда пользователь обращается к представлению индекса пользователей, я хочу показать ему / ей всех пользователей, принадлежащих к группе, к которой он / она принадлежит: я создал следующий код, который не работает. Я не могу заставить запрос работать. Пиз, помоги!

Код в пользовательском контроллере

class UsersController < ApplicationController

  def index
      @users = current_user.relevant_members
  end

end

код в пользовательской модели

def relevant_members
  group_ids = self.group_ids
  user_ids = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})")
  User.find(user_ids)
end

Я не понимаю, почему при тестировании в консоли user_ids - это не массив идентификаторов, а следующий массив:

[#<Membership user_id: 2>, #<Membership user_id: 2>, #<Membership user_id: 3>, #<Membership user_id: 3>, #<Membership user_id: 3>, #<Membership user_id: 2>]

Что было бы лучшим способом вернуть массив идентификаторов пользователей, чтобы найти всех соответствующих членов группы?

Ответы [ 5 ]

3 голосов
/ 27 октября 2011

Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})")

всегда возвращает массив объектов Membership, select ("user_id") изменяет только те поля, которые загружены из БД в объект.

Достаточно отобразить егодля удостоверения личности

user_ids = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})").map(&:user_id)
1 голос
/ 09 мая 2017

Вы пробовали использовать функцию pluck ()? https://apidock.com/rails/ActiveRecord/Calculations/pluck

user_ids = Membership.pluck("user_id").where("group_id IN (#{group_ids.join(", ")})")
1 голос
/ 27 октября 2011

Membership.select('user_id') вернет массив объектов Membership только с атрибутом user_id, пока это правильно. Это будет работать, если вы извлечете идентификаторы из результата:

membershipts = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})")
user_ids = memberships.map(&:user_id)

С наилучшими пожеланиями

Tobias

0 голосов
/ 27 октября 2011
Membership.where("group_id in (#{groups.collect(&:id).join(',')})")
    .all.collect(&:user_id)
0 голосов
/ 27 октября 2011

Это потому, что ваш user_ids является объектом класса Membership и, следовательно, вы не можете получить массив 'user_ids' напрямую

Вы должны сделать что-то вроде следующего:

  user_ids = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})")
  user_ids_array = user_ids.collect{|u| u.user_id}
  User.find(user_ids_array)

Также вы можете изменить условие where следующим образом, что более рубиново.

user_ids = Membership.select("user_id").where(["group_id IN (?)", group_ids])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...