2011-09-22 38 views
3

拳有点背景时选择唯一行: 我使用Rails 3.0.7,Postgres的9.0和MetaWhere /元搜索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 

到目前为止好。现在我想要做的就是找到所有的汽车,那就是菲亚特熊猫的(:品牌,车型上的:model_name属性)。这很好。但是如果我想从卖家表中也加入一些信息,问题就会开始显现 - 我得到的是重复的汽车!我做的是以下几点:

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怎么样 - 我担心它也会干扰这个。

回答

5

包括执行LEFT OUTER JOIN,它确实会创建重复项。如果你不需要查询(N + 1查询问题)后访问每个@ car.seller,只是用加入代替:

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

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