我在 Rails 3.2、Ruby 1.9.2 我正在尝试使用范围连接/合并语法来保持我的模型逻辑干燥。我在测试这个时遇到了麻烦,我不知道为什么。
产品.rb:
belongs_to :product_status
scope :sellable, -> {joins(:product_status).where('products.quantity_available > 0').merge(ProductStatus.sellable)}
产品状态.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)
但我需要能够从产品模型中进行此调用。任何帮助将不胜感激。