0

私はレールに慣れていないので、ばかげている場合は質問を許してください:S

私は選択した e コマース プラットフォームとして 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

ありがとう!

4

1 に答える 1

0

squeel gemを使用すると、時間を大幅に節約できます。ブロックを広範囲に使用し、純粋なRubyで次のようなクエリを(他の機能の中でも)作成できるようにします。

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

角かっこを使用し、記号がないことに注意してください。

これらの機能を使用するには、次の行をGemfile:に追加するだけです。

gem 'squeel'

を実行しますbundle install

于 2012-04-20T10:01:36.600 に答える