У меня две модели
class Product < ActiveRecord::Base
belongs_to :category
end
class Product < ActiveRecord::Base
belongs_to :category
end
Теперь я хочу перечислить все категории с их самыми дешевыми продуктами. Это очень легко сделать путем получения всех категорий, итерации по ним и поиска самого дешевого продукта по отдельности, но это делает много запросов и очень медленный. Я могу сделать это довольно легко с SQL - что-то вроде
SELECT products.*, categories.*
FROM products
JOIN categories ON (categories.id = products.owner_id)
LEFT JOIN products as cheaper_products ON
cheaper_products.category_id = epochs.category_id AND
cheaper_products.price < products.price
WHERE cheaper_products.owner_id IS NULL
что является хорошим трюком для SQL, когда мы «СЛЕДУЕМ ПРИСОЕДИНЯТЬСЯ» ко всем более дешевым продуктам в пределах категории к каждому продукту, а не к тем, у кого их нет.
Я хотел бы знать, как нечто подобное можно сделать с помощью отношений Rails3 - я использую squeel, чтобы его можно было использовать также.
Наблюдение : Я думал об определении отношения: cheap_products в продуктах, но, похоже, это тоже не помогает.
Другая идея : ее также можно решить с помощью подзапросов, возвращающих идентификаторы всех самых дешевых продуктов в их категории, но это также не позволило мне найти решение (и менее элегантно).
Примечание : Я знаю, как это сделать с помощью bruteforce (selector_sql), но мне бы очень хотелось узнать больше о рельсах 3 способа сделать это.