Мне всегда было интересно, как запрашивать и получать результаты, которые не вписываются в модель. Аналогично тому, как это делается с помощью 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
В основном мне нужно получить список продуктов (желательно просто идентификатор и имя) вместе с количеством просмотров. Очевидно, упорядочено по количеству просмотров 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 3, и, в частности, этот? Любые предложения по улучшению моей работы приветствуются.
Спасибо