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
謝謝!
嗯,雖然這個解決方案可能工作,我寧願看看是否有另一種方式使用活動記錄,因爲不確定這會通過數據傳遞的應用程序的其餘部分有什麼影響? – ashga 2012-04-20 10:39:19
這顆寶石非常受歡迎。它有很好的歷史。即使它被「插入」,你仍然可以用舊的方式寫你的應用程序('where(id:5)')。所以它與你的代碼兼容。 – jdoe 2012-04-20 11:05:18
好吧,我設法通過改變連接來解決最初的問題。但現在where子句增加了額外的AND(在我的查詢之前:S – ashga 2012-04-23 09:32:41