2

私はRails 3.2、Ruby 1.9.2を使用しています。スコープの結合/マージ構文を使用して、モデルのロジックを乾燥させようとしています。これをテストするときに問題が発生しましたが、その理由がわかりません。

product.rb:

belongs_to :product_status

scope :sellable, -> {joins(:product_status).where('products.quantity_available > 0').merge(ProductStatus.sellable)}

product_status.rb:

has_many :products

scope :sellable, -> {where("product_statuses.name in ('Active','Deactivated')")}

私のテストでは、製品ステータスのテストに合格しました:

it "should return 0 count without a valid member" do
  FactoryGirl.create(:product_status)
  ProductStatus.sellable.count.should == 0
end

it "should return 1 count with a valid member" do
  FactoryGirl.create(:active_product_status)
  ProductStatus.sellable.count.should == 1
end

しかし、製品テストに合格できません。

it "should return 1 count with a valid member" do
  active_product_status = FactoryGirl.create(:active_product_status)
  FactoryGirl.create(:product, :product_status => active_product_status)
  Product.sellable.count.should == 1
end

製品の数量が 0 以上に設定されています。その部分だけをテストするために別のスコープを作成しましたが、問題はありませんでした。

呼び出しによって作成された SQL は私には正しいように見えますが、この種のことが得意な人に問題を示す可能性があります。

SELECT COUNT(*) FROM `products` INNER JOIN `product_statuses` ON `product_statuses`.`id` = `products`.`product_status_id` WHERE products.quantity_available > 0 AND (product_statuses.name in ('Active','Deactivated'))

これをテストに追加して、active_product_status が実際に販売可能であることを確認しました

it "should return 1 count with a valid member" do
  active_product_status = FactoryGirl.create(:active_product_status)
  product = FactoryGirl.create(:product, :product_status => active_product_status)
  ProductStatus.sellable.all.include?(product.product_status).should == true
  Product.sellable.count.should == 1
end

そして、ProductStatus テストに合格しましたが、Product には合格しませんでした。

これまで結合/マージ構文を使用したことがないため、何か不足しているかどうかわかりません。次から呼び出すと、動作させることができます。

ProductStatus.sellable.joins(:products).merge(Product.sellable)

しかし、製品モデルからこの呼び出しを行うことができる必要があります。どんな助けでも大歓迎です。

4

0 に答える 0