1

私はhandles_sortable_columnsを使用してRails3の列を並べ替えていますが、結合を使用する以外に別のテーブルの列で並べ替える方法があるかどうか疑問に思っていました。

別のテーブルの列の名前をルックアップした列があります。

つまり、cities.country_idを列として使用し、ビューテンプレートで次のようにします。

@cities.each do |city|
    city.country.name

名前を表示します。

この列で並べ替えることができますが、countries.nameではありませんcities.country_id

これがgemまたは他の簡単な方法で可能かどうか誰かが知っていますか?もしそうなら、どのように?

私が考えることができる唯一のことは、コントローラーでIFステートメントを実行し、国による並べ替えをキャッチしてから、そのための結合を使用して別のクエリを実行することですが、それは醜くエラーが発生しやすく、よりエレガントなものを望んでいました。

ありがとう。

4

3 に答える 3

1

国モデルのto_sをオーバーライドして名前を返し、コントローラーでそれで並べ替えることはできますか?

あなたの国のモデルでは、to_sを次のようにオーバーライドします。

def to_s
 country.name
end

次に、コントローラーで

@sorted_cities = @cities.sort_by { |obj| obj.country.to_s }
于 2012-06-27T17:44:13.813 に答える
0

結局、私は結合を使用して、最初に適切なデータを取得することにしました。Webjediの答えは非常に興味深いものですが、組み込み関数をオーバーライドしたくありませんでしたが、それができることを知っておくとよいでしょう。

コードは次のようになります。

@countries = Country.select('countries.*, continents.name AS continent_name').joins{continent}.search(params[:term]).order(order).page(params[:page])
于 2012-08-07T09:15:28.380 に答える
0

Webjediの答えに加えて..

 @sorted_cities = @cities.includes(:country).sort_by { |obj| obj.country.to_s } #for eager loading
于 2013-03-11T14:17:49.110 に答える