2011-09-22 69 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,所以你不應該得到重複。