2015-08-09 121 views
0

我有3个班,ProductsProductDetailsProductStatuses显示孩子的家长上显示计数 - 轨道4

第一个具有一般的数据。

第二个库存/库存和产品的详细信息。

第三个决定是否可以销售ProductDetail(产品系列)。

我想在Products索引(常规视图)中显示产品的库存计数。

该机型的优势如下:

class Product < ActiveRecord::Base 
    has_many :product_details 
end 

class ProductDetail < ActiveRecord::Base 
    belongs_to :product, foreign_key: :product_id 
    belongs_to :product_status, foreign_key: :status 
end 

class ProductStatus < ActiveRecord::Base 
    has_many :product_details 
end 

的模式是:

create_table "product_details", force: :cascade do |t| 
    t.integer "product_id", limit: 4 
    t.string "serial",  limit: 255 
    t.string "comment", limit: 255 
    t.datetime "created_at",    null: false 
    t.datetime "updated_at",    null: false 
    t.integer "status",  limit: 4 
end 

create_table "product_statuses", force: :cascade do |t| 
    t.boolean "available" 
    t.string "name",  limit: 255 
    t.datetime "created_at",    null: false 
    t.datetime "updated_at",    null: false 
end 

create_table "products", force: :cascade do |t| 
    t.string "name",  limit: 255 
    t.datetime "created_at",    null: false 
    t.datetime "updated_at",    null: false 
    t.boolean "published" 
end 

我用Rails初学者。

我不知道如何让孩子数。这听起来像是一个常见问题,但我无法找到答案。

需要帮助:(

感谢

回答

1

你必须知道一点点SQL得到你想要的东西以有效的方式你的ActiveRecord的查询可能是这个样子:

@products_with_counts = Product.all.select(
    'products.*, count(product_statuses.id) as product_count' 
).joins(
    :product_details => :product_statuses 
).where(
    :product_statuses => { :available => true } 
).group('products.id') 

下面是如何,您可以访问计数的例子:

@products_with_counts.each do |product| 
    puts "Product: #{product.name} \t Number Available: #{product.product_count}" 
end 

我语法可能在joins方法中关闭。参考文献:

http://guides.rubyonrails.org/active_record_querying.html#joining-tables

关键的一点是,你必须写一个SQL SELECT子句将包括product_statuses表计数,并把它传递给select方法。

此外,请注意,此查询将只返回具有一个或多个product_details行的产品,其中available设置为true。如果要返回所有产品,即使那些计数为零的产品,也必须编写一个使用LEFT JOIN而不是INNER JOIN的自定义SQL连接子句,并将其传递给joins方法。有关SQL的详细信息联接:

http://www.techonthenet.com/sql/joins.php

+0

我知道SQL确实不错,但这种下降我下面的错误:协会命名为“product_statuses”在产品详情没有被发现;也许你拼错了吗? –

+0

明白了,我解决了它,但查询只给出了具有可用库存的产品,我希望所有产品都具有计数,包括0:'( –

0

解决这个:

型号:product.rb

def self.stock() 
    select('products.*, SUM(case when product_statuses.available=true then 1 else 0 end) as product_count') 
    .joins('LEFT JOIN `product_details` `product_details` ON `product_details`.`product_id` = `products`.`id`') 
    .joins('LEFT JOIN `product_statuses` ON `product_statuses`.`id` = `product_details`.`status`') 
    .group('products.id') 
end 

控制器:products_controller。RB

@products = Product.all.stock