1

2つの関連レベルの深さで、条件もある属性でソートする方法を探しています。

Shop モデルまたは Warehouse モデルと関連付ける必要がある注文モデルがあります。これらのモデルは両方とも、名前を持つ国に関連付けられています。

私の目標は次のとおりです。

注文を絞り込み、国名で並べ替えます。

結果は ActiveRelation オブジェクトでなければなりません

そして主な目標は、ビュー ヘルパー sort_link の MetaSearch gem にこのスコープを使用することです

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, ...]

実際にこれが可能かどうかわからないので、アドバイスをいただければ幸いです。

ありがとう

4

1 に答える 1

2

このように書くことができますが、私は試していません:

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

これは、あなたが持っていると仮定しています

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

倉庫クラスで。

編集:

倉庫の国または店舗の国のいずれかを取得するため、国名の最初の非 null エントリを選択するためのロジックが select クエリに必要です。PostgreSQL と MySQLは、null 以外の最初の列を返す関数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
于 2012-04-25T07:40:22.157 に答える