【问题标题】:Rails match 2 arraysRails 匹配 2 个数组
【发布时间】:2018-03-26 08:44:24
【问题描述】:

我有 2 个模型 Donation 和 BankDeposit

捐赠有一列 sender_id

银行存款有一列donated_by_id

假设我有:

@donations = Donation.all
@bank_deposits = BankDeposit.all

这两个数组为提到的列返回这个值:

@donations.sender_id = [1,3,6,8,9]
@bank_deposits.donated_by_id = [2,3,7,8]

在此示例中,假设捐赠的 id 为 1 到 5,我想要实现的结果是选择 id 为 2 和 4 的行(因为它们包含 bank_deposits.donated_by_id 上的 3 和 8)。

我应该如何实现代码来实现这一点?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    如果您需要捐款,您可以更改代码并尝试:

    @donations = Donation.where(sender_id: BankDeposit.pluck(:donated_by_id))
    

    如果您想保留两者并使用所有记录,只需使用 select 过滤:

    bank_deposit_donated_by_ids = @bank_deposits.map(&:donated_by_id)
    matched_donations = @donations.select do |elem|
      bank_deposit_donated_by_ids.include?(elem.sender_id)
    end
    

    没有测试语法/API,但就是这样。

    【讨论】:

    • 这个工作并实现了我正在寻找的结果。我会在接受答案之前继续尝试,因为我猜另一个答案会更好,因为它更简单..
    • 重要的是要了解这段代码发生了什么。第一个简单地获取捐赠者也在bank deposit 表中的捐赠。但是,如果您需要执行两个查询的所有其他记录,则第二个解决方案会使用 ruby​​ mapselect 内置方法获取所有结果并使用您想要的内容进行过滤。
    • 是的,这个非常清楚,非常感谢。我已经怀疑我必须使用 pluck 或 map 但我不确定正确的语法。我只是想在判断我应该接受哪个答案之前完全理解另一个答案。
    【解决方案2】:

    试试下面的代码

    @donations.sender_id & @bank_deposits.donated_by_id
    

    这将为您提供来自两个数组的公共元素 id 的输出,之后您可以以任何您喜欢的方式对其进行过滤。

    希望它对你有用。

    【讨论】:

    • 感谢您的回复.. 但我不明白这个怎么可能返回我正在寻找的东西..
    • 2.3.0 :001 > a = [1,2,3] => [1, 2, 3] 2.3.0 :002 > b=[2,3,4,5] = > [2, 3, 4, 5] 2.3.0 :003 > a&b => [2, 3] 2.3.0 :004 >
    • 看我在控制台中尝试了示例数组及其工作。
    • 虽然这个解决方案很简单,但我无法让它在带有实例的真实示例中工作,而下面的答案在第一次尝试时有效..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多