2014-05-20 59 views
0

我有模型媽媽,爸爸和關注這是一個多態關聯。我試圖把媽媽和爸爸,用戶按照字母順序排列,因爲那裏的name屬性在哪裏混合在一起。這是我想要的和我的代碼到目前爲止。如何通過同一個屬性爲多個父關聯進行排序?

實例用戶跟着爸爸媽媽列表

Adam # Dad 
Ashley # Mom 
Brenda # Mom 
Brian # Dad 

模式

class Mom 
    has_many :follows, as: :followable 
    # columns: name 
end 

class Dad 
    has_many :follows, as: :followable 
    # columns: name 
end 

class Follow 
belongs_to :user 
belongs_to :followable, polymorphic: true 

belongs_to :dad, -> {where("follows.followable_type = 'Dad'")}, foreign_key: 'followable_id' 
belongs_to :mom, -> {where("follows.followable_type = 'Mom'")}, foreign_key: 'followable_id' 

scope :name_order, -> { includes(:dad, :mom).order("dads.name ASC", "moms.name ASC") } 
# columns: user_id, followable_id, followable_type 
end 

控制器

def index 
    @follows = current_user.follows.name_order.paginate(:page => params[:page]) 
end 

現在這個按字母順序排列,但是會把爸爸放在列表的前面,當我需要他們混合時,把所有的媽媽都敲下來。我將如何做到這一點?

+0

你可以嘗試改變'.order(「dads.name ASC」,「moms.name ASC」)''order(「following.name ASC」)' – bjhaid

+0

@bjhaid是的,我試過'和「follow.followable.name」。 – user2784630

+0

如果它只是命令範圍需要做,那麼你不需要'includes',所以你可以將範圍寫爲'scope:name_order, - > {order(「following.name ASC」)}' – bjhaid

回答

2

你可以試試:

scope :name_order, -> { 
    select("#{table_name}.*, COALESCE(dads.name, mom.name) AS follow_name"). 
    includes(:dad, :mom).references(:dad, :mom).order("follow_name") 
} 

注:未測試。

但是,看起來你的模型設計是最大的問題。由於看起來每個媽媽和爸爸都是用戶,爲什麼不使用STI呢?

+0

是的,或者只是一個父類,並有一個布爾字段「媽媽」(所以爸爸媽媽=假) –

+0

@MaxWilliams - 我通常不喜歡創建這樣的非對稱布爾型字段,因爲如果你想添加它們是非常難以處理的,比如說一個爺爺。 STI是非常靈活和可讀的解決方案。 :) – BroiSatse

+0

如果有對爺爺的要求,那麼我就不會建議它了:)就我個人而言,我不是STI的粉絲,過去有過各種麻煩和痛苦。也許我沒有正確使用它。 –

相關問題