按named_scope通过 2 个有条件的表进行排序



我正在寻找如何按属性排序的解决方案,该属性有两个关联级别,并且还有一个条件。

我有订单模型,它必须与商店模型或仓库模型相关联,这两个模型都与具有名称的国家/地区相关联。

我的目标是:

限定了订单范围并按国家/地区名称排序。

结果必须是活动关系对象

主要目标是将此范围用于元搜索 gem 以进行查看帮助程序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, ...]

实际上,我不知道这是否可能,所以我感谢任何建议。

谢谢

你可以这样写,但我还没有尝试过:

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

这是假设你有

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

在仓库类。

编辑:

由于您要采用仓库国家/地区或商店国家/地区,因此您需要在 select 查询中使用逻辑来选择国家/地区名称的第一个非空条目。PostgreSQL 和 MySQL 支持函数合并,返回第一个非空列。你应该能够像这样使用它:(同样,虽然没有尝试过)

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

最新更新