Rails has_many: через сложный запрос - PullRequest
0 голосов
/ 27 мая 2018

У меня есть эти 3 модели с отношением has_many: through:

class Package < ApplicationRecord
  belongs_to :user
  belongs_to :shipment
end

class User < ApplicationRecord
  has_many :packages
  has_many :shipments, through: :packages
end

class Shipment < ApplicationRecord
  has_many :packages
  has_many :users, through: :packages
end

Учитывая некоторую отгрузку @shipment, я хочу получить всех пользователей этой отгрузки, сгруппированных по user_id, а затем для каждого пользователя получить пакетыони попали в этот конкретный @shipment.Используя:

@shipment.users.each do |user|
  user.packages
end

Я получаю список всех пакетов пользователя , но мне необходимо получить только пакеты, находящиеся в @ shipment .Как я могу запросить это?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Похоже, вы можете начать с вашего @shipment.packages, а затем сгруппировать их по user_id, например, так:

@shipment.packages.group_by(:user_id)

В результате вы получите хешиндексируется user_id, где значения - это список пакетов отгрузки с указанным user_id.

Например, предположим, что у вас есть следующие пакеты:

+----------------------------+
| id | user_id | shipment_id |
|  1 |       1 |           1 |
|  2 |       1 |           2 |
|  3 |       2 |           3 |
|  4 |       2 |           1 |
|  5 |       3 |           1 |
|  6 |       2 |           1 |
+----------------------------+

Тогда вы получите что-токак это:

@shipment = Shipment.find(1)
@shipment.packages.group_by(&:user_id) #=> {1 => [<Package id=1>], 2 => [<Package id=4>, <Package id=6>], 3 => [<Package id=5>]}
0 голосов
/ 27 мая 2018

Если вы хотите сохранить ту же форму, что и сейчас.Попробуйте что-то вроде:

@shipment.users.group(:email).each do |user|
  user.packages(where: @shipment)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...