Rails:返回记录关联模型的ID数组全部存在的记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails:返回记录关联模型的ID数组全部存在的记录相关的知识,希望对你有一定的参考价值。
所以我有一个目标模型,每个目标都有滑冰者在得分时在冰上。我想返回目标滑冰者特定组合的目标。这种关系看起来像这样:
class Goal < ApplicationRecord
has_many :on_ice_skaters
end
class OnIceSkater < ApplicationRecord
belongs_to :goal
end
我一直在尝试通过.joins然后一个.where但它似乎返回目标,阵列中的任何玩家都存在而不是当所有存在时(每个OnIceSkater记录都有一个player_id):
player_ids = [6382,5635]
Goal.joins(:on_ice_skaters).where('on_ice_skaters.player_id' => player_ids)
想知道是否有办法将上述声明转换为功能上的AND声明(例如,使用player_id 6382和5635查找具有OnIceSkaters的目标)?
答案
如果你连续写两个.where()
条款,ActiveRecord AND
s他们在一起。试试这个:
player_ids = [6382,5635]
goals = Goal.joins(:on_ice_skaters)
player_ids.each do |player_id|
goals = goals.where(on_ice_skaters: { player_id: player_id })
end
我冒昧地将你的字符串升级为哈希。它可能更准确,看起来更像是Railsey。
另一答案
我不确定为什么Phlip的答案不起作用(正如OP在评论中所说)。如果你不能使它工作,那么你有一个更复杂和更有效的方法(它使player_id + 1个查询的数量):
player_ids = [6382,5635]
# All goal ids for player 6328 (first player in the array)
goal_ids = Goal.joins(:on_ice_skaters).where(on_ice_skaters: { player_id: player_ids[0] }).pluck(:id).uniq
player_ids.shift.each do |player_id|
# Keep only goals in common for each other player
goal_ids = goal_ids & Goal.joins(:on_ice_skaters).where(on_ice_skaters: { player_id: player_id }).pluck(:id).uniq
end
# Take these ids.
goals = Goal.where(id: goal_ids)
以上是关于Rails:返回记录关联模型的ID数组全部存在的记录的主要内容,如果未能解决你的问题,请参考以下文章