You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails匹配两个数组:筛选Donation与BankDeposit关联记录

嘿,这个需求用Rails的ActiveRecord就能轻松实现,我给你几个实用的方案,你可以根据数据规模和场景来选:

方案1:先提取ID数组再筛选(直观易懂,适合数据量小的场景)

先从BankDeposit里取出所有的donated_by_id,再用这个数组去匹配Donation的sender_id:

# 提取所有BankDeposit的donated_by_id,用uniq避免重复值(可选,视数据情况而定)
donated_by_ids = BankDeposit.pluck(:donated_by_id).uniq
# 筛选出sender_id在上述数组中的Donation记录
target_donations = Donation.where(sender_id: donated_by_ids)

按照你的例子,donated_by_ids会是[2,3,7,8],最终筛选出的就是sender_id为3和8的Donation(也就是id为2和4的记录)。

方案2:子查询(高效推荐,适合数据量大的场景)

不用先把ID加载到内存,直接让数据库层面完成关联查询,只发一条SQL,性能更优:

target_donations = Donation.where(sender_id: BankDeposit.select(:donated_by_id))

这个写法会生成一条包含子查询的SQL,数据库会直接帮你匹配符合条件的记录,避免了把大量ID数组加载到应用内存里的问题。

方案3:关联查询(如果模型有对应关联的话)

如果你已经给两个模型建立了关联(比如假设sender_id和donated_by_id都关联到同一个User模型),还可以用joins来做关联查询:
首先在模型里定义关联:

# Donation模型
belongs_to :sender, class_name: 'User' # 替换成你实际的关联模型名
# BankDeposit模型
belongs_to :donated_by, class_name: 'User'

然后用joins查询:

target_donations = Donation.joins("INNER JOIN bank_deposits ON donations.sender_id = bank_deposits.donated_by_id").distinct

加上distinct是为了防止同一个Donation因为对应多条BankDeposit记录而重复出现。

这几种方法都能帮你得到想要的结果,我个人更推荐方案2,既简洁又高效~

内容的提问来源于stack exchange,提问作者catmal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:37:22