掌握一点背景知识:我正在使用 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
到现在为止还挺好。现在我想做的是找到所有汽车,即菲亚特熊猫的(汽车上的:品牌,:模型名称属性)。这一切都很好。但是,如果我还想从卖家表中获取一些信息,问题就开始显现——我得到了重复的汽车!!!我要做的是:
Car.includes(:adverts, :sellers).where(:brand >> 'Fiat', :model_name >> 'Panda', :sellers => [:kind >> 'Dealer'])
现在您可能会争辩说,这是不可能的,因为“数据库应该如何知道从连接到每辆车的所有卖家中选择哪个 :kind ?” 但我不在乎,因为它们都是一样的,所以无论是第一个还是最后一个卖家都没有关系,它会从中获取属性值。如果我执行 .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')
但我完全不确定这一点!那元位置/元搜索呢?我担心它也会干扰这个。