Сортировка в 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, ...]

На самом деле я не знаю, возможно ли это, поэтому я ценю любые советы.

Спасибо


person Suborx    schedule 24.04.2012    source источник


Ответы (1)


Вы можете написать это так, я не пробовал, хотя:

scope :sort_by_warehouse_country_name, joins(:warehouse).order('warehouse.country_name DESC')

Это при условии, что у вас есть

delegate :name, to: :country, prefix: true

В классе Склад.

РЕДАКТИРОВАТЬ:

Поскольку вы хотите взять либо страну склада, либо страну магазина, вам нужна логика в запросе на выбор, чтобы выбрать первую ненулевую запись для названия страны. 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
person Salil    schedule 25.04.2012
comment
Хорошая идея с использованием метода делегата, но не уверен, что это работает. Однако проблема в том, что у заказа есть склад или магазин, а вы описываете только один случай со складом. Но не у каждого заказа есть склад. - person Suborx; 25.04.2012
comment
Ставлю сюда склад, так как из вашего вопроса не понятно, что означает сортировка заказов по стране - страна склада или страна магазина. Вы можете сделать то же самое для магазина и соответственно сортировать заказы. - person Salil; 26.04.2012
comment
В том-то и проблема, что мне нужно охватить оба этих варианта одновременно. Думаю, я должен использовать что-то вроде UNION в sql. - person Suborx; 26.04.2012
comment
У вас могут быть трудные времена, потому что Arel в настоящее время не поддерживает объединение заказов: github.com /rails/arel/issues/98. Это, вероятно, того не стоит, но вы можете сделать UNION в представлении и переместить соответствующую логику в эту модель или определить область в модели Order, которая использует соединение Orders с голой моделью представления, тем самым сохраняя все следуя логике в порядке. - person Steve Rowley; 04.05.2012