gpt4 book ai didi

ruby-on-rails - 进行连接时选择唯一行

转载 作者:行者123 更新时间:2023-11-29 11:42:06 24 4
gpt4 key购买 nike

拳头一点背景:我正在使用 Rails 3.0.7、Postgres 9.0 和 MetaWhere/MetaSearch 1.0.4

在查询我的数据库时获取唯一记录时,我遇到了一个非常令人沮丧的问题。我有 3 个模型如下:

class Car < ActiveRecord::Base
has_many :sellers, :through => :adverts, :uniq => true
has_many :adverts, :dependent => :destroy
end

class Seller < ActiveRecord::Base
has_many :cars, :through => :adverts, :uniq => true
has_many :adverts
end

class Advert < ActiveRecord::Base
belongs_to :car, :autosave => false
belongs_to :seller, :autosave => false
end

到目前为止一切顺利。现在我想做的是,找到所有的汽车,即菲亚特 Pandas 的(汽车上的品牌、车型名称属性)。这一切都很好。但是,如果我还想加入一些来自卖家表的信息,问题就会开始显现——我得到了重复的汽车!!!我所做的是:

Car.includes(:adverts, :sellers).where(:brand >> 'Fiat', :model_name >> 'Panda', :sellers => [:kind >> 'Dealer'])

现在您可能会争辩说,这是不可能的,因为“数据库应该如何知道从连接到每辆车的所有卖家中选择哪种类型?”但我不在乎,因为它们都是一样的,所以无论是第一个还是最后一个卖家都没有关系,它从中获取属性值。如果我执行 .debug_sql,我会得到以下信息:

SELECT cars.*, sellers.*, adverts.* FROM cars LEFT OUTER JOIN adverts ON adverts.car_id = cars.id LEFT OUTER JOIN adverts sellers_cars_join ON cars.id = sellers_cars_join.car_id LEFT OUTER JOIN sellers ON sellers.id = sellers_cars_join.seller_id WHERE cars.brand = 'Fiat' AND cars.model_name = 'Panda' AND sellers.kind = 'Dealer'

因为这给了我重复项,它给出了完美的意义 - 但我该如何解决呢? - 因为这不是我想要的。

我可以看到两种可能的解决方案:首先,如果我能以某种类似于 rails 的方式让它执行

SELECT DISTINCT(cars.id), cars.*, sellers.*, adverts.* FROM cars LEFT....

看来它会给我正确的东西。

其次,如您所见,我已将 :uniq => true 添加到关联中,但据我所知,如果我从卖家处声明并要求这样的汽车,这将仅在我的示例中起作用:

Seller.includes(:adverts, :cars).where(:cars => [:brand >> 'Fiat'], :cars => [:model_name >> 'Panda'], :kind >> 'Dealer')

但我对此完全不确定!那么 metawhere/metasearch 呢 - 我担心它也会干扰这一点。

最佳答案

includes 执行 LEFT OUTER JOIN,这确实会创建重复项。如果您不需要在查询后访问每个@car.seller(n+1 查询问题),只需使用连接即可:

Car.joins(:sellers).
where(:cars => {:brand => 'Fiat',
:model_name => 'Panda'},
:sellers => {:kind => 'Dealer'})

joins 执行 INNER JOIN,所以你不应该得到重复项。

关于ruby-on-rails - 进行连接时选择唯一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7514957/

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