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 ANDs他们在一起。试试这个:

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数组全部存在的记录的主要内容,如果未能解决你的问题,请参考以下文章

列出存在于另一个模型中的所有关联模型记录,该模型存在于 rails 中的另一个命名空间中

Rails引用相同模型的活动记录关联

Rails - 验证关联的存在?

Rails 搜索 HABTM 关系中的关联模型

命名空间模型中的 Rails 关联

向模型添加用户 ID 数组 - Rails 4