gpt4 book ai didi

ruby-on-rails - 选择一个集合的补集

转载 作者:行者123 更新时间:2023-12-02 04:06:59 25 4
gpt4 key购买 nike

我正在使用 Rails 3.0。我有两个表:列表和优惠。一个列表 has-many优惠。一个报价可以有acceptedtruefalse .

我想选择每个没有带有 accepted 的报价的列表是真的。我试过

Listing.joins(:offers).where('offers.accepted' => false)

但是,由于一个列表可以有多个报价,因此这会选择每个具有未接受报价的列表,即使该列表有一个已接受的报价。

如果不清楚,我想要的是集合的补充:
Listing.joins(:offers).where('offers.accepted' => true)

我目前的临时解决方案是获取所有这些,然后对数组进行过滤,如下所示:
class Listing < ActiveRecord::Base
...
def self.open
Listing.all.find_all {|l| l.open? }
end

def open?
!offers.exists?(:accepted => true)
end
end

如果解决方案在数据库端运行过滤,我更愿意。

最佳答案

想到的第一件事是基本上做你现在正在做的事情,但在数据库中。

scope :accepted, lambda {
joins(:offers).where('offers.accepted' => true)
}

scope :open, lambda {
# take your accepted scope, but just use it to get at the "accepted" ids
relation = accepted.select("listings.id")

# then use select values to get at those initial ids
ids = connection.select_values(relation.to_sql)

# exclude the "accepted" records, or return an unchanged scope if there are none
ids.empty? ? scoped : where(arel_table[:id].not_in(ids))
}

我确信这可以使用外部连接和分组更干净地完成,但它不会立即出现:-)

关于ruby-on-rails - 选择一个集合的补集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132355/

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