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
相关产品推荐
相关产品推荐

