我有这三个模型与has_many:通过关系:
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 中的软件包。 我该如何查询?
答案 0 :(得分:0)
如果您希望保持与目前相同的格式。尝试类似:
@shipment.users.group(:email).each do |user|
user.packages(where: @shipment)
end
答案 1 :(得分:0)
看起来您可以从@shipment.packages
开始,然后将其按user_id
分组,如下所示:
@shipment.packages.group_by(:user_id)
因此,您将获得由user_id
索引的哈希值,其中值是具有给定user_id
的货件包列表。
E.g。假设您有以下包裹:
+----------------------------+
| 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>]}