ActiveRecord.joins添加不需要的sql

时间:2012-04-20 09:17:01

标签: ruby-on-rails activerecord spree

我是rails的新手,请原谅这个问题,如果它是愚蠢的:S

我使用Spree作为我选择的电子商务平台。

在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

谢谢!

1 个答案:

答案 0 :(得分:0)

使用squeel gem可以节省大量时间。它广泛使用块,并允许您在纯Ruby上编写(以及其他功能)这样的查询:

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

注意使用方括号和没有符号。

要使用这些功能,只需将此行添加到Gemfile

即可
gem 'squeel'

并运行bundle install