【发布时间】:2011-04-26 21:01:03
【问题描述】:
我一直想知道如何查询和获取不适合模型的结果。与使用 LINQ 并投影到匿名对象的方式类似。
这是简单的架构:
# Product.rb
class Product < ActiveRecord::Base
has_many :product_views
# attributes: id, name, description, created_at, updated_at
end
# ProductView.rb
class ProductView < ActiveRecord::Base
belongs_to :product
# attributes: id, product_id, request_ip, created_at, updated_at
end
基本上,我需要获取产品列表(最好只是 id 和名称)以及它的查看次数。显然是按观看次数 desc 排序的。
这是我想要得到的 SQL:
select
p.id,
p.name,
count(pv.product_id) as views
from
product_views pv
inner join
products p on pv.product_id = p.id
group by
pv.product_id
order by
count(product_id) desc
我尝试了以下和类似的方法,但我得到的是 ProductView 对象,我只想得到一个数组或其他什么。
ProductView.includes(:product)
.group('product_id')
.select("products.id, products.name, count(product_id)")
这种事情使用普通的 SQL 或 LINQ 是微不足道的,但我发现自己在 Rails 中遇到了这种查询。也许我没有以著名的“rails 方式”思考,也许我错过了一些明显的东西。
那么你如何在 Rails 3 中进行这种查询,特别是这个查询?欢迎提出任何改进我这样做的方式的建议。
谢谢
【问题讨论】:
标签: activerecord arel ruby-on-rails-3