2012-04-20 69 views
0

我新的軌道,所以如果它的愚蠢原諒的問題:SActiveRecord.joins增加不必要的SQL

我使用施普雷爲我選擇的電子商務平臺。

在Rails的控制檯我運行:

Spree::Product.joins(:product_properties, :taxons, :variants).limit(10) 

這個返回SQL:

SELECT `spree_products`.* FROM `spree_products` INNER JOIN `spree_product_properties` ON `spree_product_properties`.`product_id` = `spree_products`.`id` INNER JOIN `spree_products_taxons` ON `spree_products_taxons`.`product_id` = `spree_products`.`id` INNER JOIN `spree_taxons` ON `spree_taxons`.`id` = `spree_products_taxons`.`taxon_id` INNER JOIN `spree_variants` ON `spree_variants`.`product_id` = `spree_products`.`id` AND `spree_variants`.is_master = 0 AND `spree_variants`.deleted_at IS NULL LIMIT 10 

不過,我需要的sql設定值

`spree_variants`.is_master = 1 AND `spree_variants`.deleted_at IS NOT NULL 

難道一個一個知道如何做到這一點?我曾嘗試

Spree::Product.joins(:product_properties, :taxons, :variants).limit(10).where("`spree_variants`.is_master = 1 AND `spree_variants`.deleted_at IS NOT NULL") 

但這並不工作,並生成以下SQL

SELECT `spree_products`.* FROM `spree_products` INNER JOIN `spree_product_properties` ON `spree_product_properties`.`product_id` = `spree_products`.`id` INNER JOIN `spree_products_taxons` ON `spree_products_taxons`.`product_id` = `spree_products`.`id` INNER JOIN `spree_taxons` ON `spree_taxons`.`id` = `spree_products_taxons`.`taxon_id` INNER JOIN `spree_variants` ON `spree_variants`.`product_id` = `spree_products`.`id` AND `spree_variants`.is_master = 0 AND `spree_variants`.deleted_at IS NULL WHERE (`spree_variants`.is_master = 1 AND `spree_variants`.deleted_at IS NOT NULL) LIMIT 10 

謝謝!

回答

0

通過使用​​寶石,您將節省大量時間。它使用廣泛塊,並允許你寫的(除其他功能)查詢這樣的純Ruby:方括號和無符號的

.where{(spree_variants.is_master == 1) & (spree_variants.deleted_at != nil)} 

注意使用。

要使用這些功能只是這一行添加到您的Gemfile

gem 'squeel' 

和運行bundle install

+0

嗯,雖然這個解決方案可能工作,我寧願看看是否有另一種方式使用活動記錄,因爲不確定這會通過數據傳遞的應用程序的其餘部分有什麼影響? – ashga 2012-04-20 10:39:19

+0

這顆寶石非常受歡迎。它有很好的歷史。即使它被「插入」,你仍然可以用舊的方式寫你的應用程序('where(id:5)')。所以它與你的代碼兼容。 – jdoe 2012-04-20 11:05:18

+0

好吧,我設法通過改變連接來解決最初的問題。但現在where子句增加了額外的AND(在我的查詢之前:S – ashga 2012-04-23 09:32:41

相關問題