Nie*_*ian 3 postgresql ruby-on-rails meta-search meta-where
有点背景:我使用的是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
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在我要做的是,找到所有的汽车,就是菲亚特熊猫(:品牌,汽车上的model_name属性).这很好.但是,如果我想从卖家表中加入一些信息,那么问题就开始显现 - 我正在获得重复的汽车!我所做的是以下内容:
Car.includes(:adverts, :sellers).where(:brand >> 'Fiat', :model_name >> 'Panda', :sellers => [:kind >> 'Dealer'])
Run Code Online (Sandbox Code Playgroud)
现在你可以争辩说,这是不可能的,因为"数据库应该如何知道哪种:从所有连接到每辆车的卖家中选择哪种?" 但是我不在乎,因为它们都是一样的,所以如果它是第一个或者它是最后一个卖家它是否具有属性值并不重要.如果我执行.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'
Run Code Online (Sandbox Code Playgroud)
因为这给了我重复,它给出了完美的感觉 - 但我怎么能解决它? - 因为它不是我想要的.
我可以看到两个可能的解决方案:首先如果我能以某种方式以类似轨道的方式让它执行
SELECT DISTINCT(cars.id), cars.*, sellers.*, adverts.* FROM cars LEFT....
Run Code Online (Sandbox Code Playgroud)
它似乎会给我正确的东西.
第二,正如你所看到的,我已经在协会中添加了一个:uniq => true,但是如果我从卖家那里得到并且要求这样的汽车,那么就我可以看到只能在我的例子中工作:
Seller.includes(:adverts, :cars).where(:cars => [:brand >> 'Fiat'], :cars => [:model_name >> 'Panda'], :kind >> 'Dealer')
Run Code Online (Sandbox Code Playgroud)
但我根本不确定这一点!那么metawhere /元搜索呢 - 我担心它也会干扰它.
包括执行LEFT OUTER JOIN,这确实会产生重复.如果您在查询后不需要访问每个@ car.seller(n + 1查询问题),只需使用连接:
Car.joins(:sellers).
where(:cars => {:brand => 'Fiat',
:model_name => 'Panda'},
:sellers => {:kind => 'Dealer'})
Run Code Online (Sandbox Code Playgroud)
连接执行INNER JOIN,因此您不应该重复.
| 归档时间: |
|
| 查看次数: |
1436 次 |
| 最近记录: |