我有3个课程,Products
,ProductDetails
,ProductStatuses
第一个有一般数据。
第二个库存/库存和产品的详细信息。
第三个确定是否有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。
我不知道如何让孩子数数。这听起来像是一个常见问题,但我无法找到答案。
需要帮助:(
由于
答案 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连接的更多信息:
答案 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