在父节目中显示孩子的数量 - Rails 4

时间:2015-08-09 01:23:12

标签: ruby-on-rails count parent-child ruby-on-rails-4.2

我有3个课程,ProductsProductDetailsProductStatuses

第一个有一般数据。

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

第三个确定是否有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。

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

需要帮助:(

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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