【问题标题】:Rails: Return Records Where Array of IDs for Associated Model All ExistRails:返回相关模型的 ID 数组全部存在的记录
【发布时间】:2018-03-02 22:04:54
【问题描述】:

所以我有一个进球模型,每个进球在得分时都有滑冰者在冰上。我想返回特定组合的滑冰者为一个目标而奋斗的目标。关系如下:

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 的目标)?

【问题讨论】:

    标签: ruby-on-rails ruby postgresql join


    【解决方案1】:

    如果您连续编写两个.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。

    【讨论】:

    • 只是想知道这是否会导致每次运行循环中的表达式时都会执行 where 方法调用。有没有办法先将它们链接起来,然后发送 execute
    • @manu29.d 尝试将数组传递给 where:goals.where(on_ice_skaters: {player_id: player_ids})
    • @maxpleaner 但这将再次成为问题陈述。那不是我的考虑。我在想是否有更有效的方法来做到这一点?
    • ActiveRecord 是惰性的,在您需要之前不会执行任何操作,因此在您实际访问数据之前不会执行查询。
    • 懒加载了,试试看。该值没有被使用,这是 Rails 构建 sql 查询的方式。
    【解决方案2】:

    我不确定为什么 Phlip 的回答不起作用(正如 OP 在评论中所说)。如果你不能让它工作,这里你有一个更复杂且效率不高的方法(它会产生 number of player_ids + 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)
    

    【讨论】:

    • 最终做了类似的事情。我会回去再次尝试Phlip的答案,也许这是我的目的。它肯定是最干净的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多