gpt4 book ai didi

mysql - rails 3 : Why is flatten duplicating records with more than one associated record?

转载 作者:行者123 更新时间:2023-11-29 13:30:09 33 4
gpt4 key购买 nike

协会:

  • 货件中有很多发票
  • 发票属于发货

我收到这样的发货 list ...

@shipments = Shipment.joins(:invoices).where(:customer_id => @customer.id).where("customer_open_balance <> 0").where("bill_to IS NULL").order("file_number ASC") 

然后我像这样压平......

@invoices = @shipments.map(&:invoices).flatten

我收到重复的内容。例如,我在这条线上方执行发货查询,@shipments.count 我得到 5 个结果。

然后,在我压平后,如果有一批 cargo 有两张发票,它会重复它们,我会得到 4 张而不是两张 @invoices.count 我会得到 7 张(应该仍然是 5 张)。

最佳答案

当您使用连接时,返回的记录可能是重复的。因此,如果Tree有许多叶子,那么Tree.joins(:leaves).count将等于叶子数量并且有很多重复记录的。这是因为 joins 正在调用 sql 的 INNER JOIN,它返回两个表的交集。

来自Rails guide :

Category.joins(:posts)

Or, in English: “return a Category object for all categories with posts”. Note that you will see duplicate categories if more than one post has the same category. If you want unique categories, you can use Category.joins(:post).select(“distinct(categories.id)”).

所以对于你的情况,这样的事情会起作用:

@shipments = Shipment.joins(:invoices).where(:customer_id => @customer.id).where("customer_open_balance <> 0").where("bill_to IS NULL").order("file_number ASC").
select("distinct(shipments.id)")

另一种方法是使用group

@shipments = Shipment.joins(:invoices).where(:customer_id => @customer.id).where("customer_open_balance <> 0").where("bill_to IS NULL").order("file_number ASC").
group("shipments.id")

我更喜欢 group,因为与其他作用域链接时,Rails 中的 select 语句有时会被忽略。

PS:如果您的查询对 invoices 没有任何条件,请尝试使用 includes 而不是 joins。这将通过一个查询立即加载所有发票,而不是为每个发货进行单独的查询。

关于mysql - rails 3 : Why is flatten duplicating records with more than one associated record?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19577914/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com