通过表2与条件named_scope排序(Sorting in named_scope throug

2019-10-16 15:47发布

我要寻找的解决方案如何通过属性,是两个关联级深,也有一个条件进行排序。

我有必须与店模式或仓库模式这两种模式都与国家,有一个名字相关联的关联顺序模式。

我的目标是:

作用域按国家名称的订单和排序。

结果必须是一个ActiveRelation对象

而主要目标是使用此范围内的元搜索创业板视图助手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, ...]

Actualy我不知道这是可能的,所以我很感激任何意见。

谢谢

Answer 1:

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

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

这是假设你有

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

仓库类。

编辑:

既然你想利用在任一仓库国家或商店的国家,你需要选择查询逻辑来选择国名的第一个非空项。 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


文章来源: Sorting in named_scope through 2 tables with condition