Сортировка в named_scope по 2 таблицам с условием
Я ищу решение, как сортировать по атрибуту, который имеет два уровня ассоциации и также имеет условие.
У меня есть модель заказа, которая ДОЛЖНА быть связана с моделью магазина ИЛИ моделью склада. Обе эти модели связаны со страной, которая имеет название.
Мои цели:
Определите объем заказов и сортируйте по названию страны.
Результат должен быть объектом ActiveRelation
И главная цель - использовать эту область для гема MetaSearch для помощника вида sort_link
class Order < ActiveRecord::Base
belongs_to :shop
belongs_to :warehouse
validate :shop_id, :presence => true, :if => "warehouse_id.nil?"
validate :warehouse_id, :presence => true, :if => "shop_id.nil?"
#the case with shop_id.present? && warehouse_id.present? does not exist
scope :sort_by_country_name, ???
end
class Shop < ActiveRecord::Base
belongs_to :country
end
class Warehouse < ActiveRecord::Base
belongs_to :country
end
Country.coulumn_names => [:id, :name, ...]
На самом деле я не знаю, возможно ли это, поэтому я ценю любой совет.
Спасибо
1 ответ
Вы можете написать это так, я еще не пробовал:
scope :sort_by_warehouse_country_name, joins(:warehouse).order('warehouse.country_name DESC')
Это предполагает, что у вас есть
delegate :name, to: :country, prefix: true
В классе WareHouse.
РЕДАКТИРОВАТЬ:
Поскольку вы хотите использовать страну складирования или магазин, вам нужна логика в запросе выбора, чтобы выбрать первую ненулевую запись для названия страны. PostgreSQL и MySQL поддерживают функцию coalesce, которая возвращает первый ненулевой столбец. Вы должны быть в состоянии использовать это так: (Опять же, еще не пробовал, хотя)
def self.sort_by_country_name
Order.select("COALESCE(warehouse.country_name, shop.country_name) as country_name").joins(:warehouse, :shop).order("country_name DESC")
end