ActiveScaffoldでは、あるモデルに関係している情報もいい感じで表示してくれる機能があります。
例えば、以下のモデルがあるとします。
class User < ActiveRecord::Base belongs_to :group end class Group < ActiveRecord::Base has_many :users def to_label "#{code}:#{name}" end end
それぞれのテーブルは、以下の情報を持つとします。
users
id | group_id | name |
---|---|---|
1 | 1 | aaa |
2 | 1 | bbb |
3 | 3 | ccc |
groups
id | code | name |
---|---|---|
1 | g1 | xxx |
2 | g2 | yyy |
Userの一覧を表示するならば以下のような感じのコントローラーを作成します。
class UsersController < ApplicationController active_scaffold :user do |config| config.columns = [:id, :group, :name] config.columns[:group].form_ui = :select end end
これで表示するとUser一覧にグループ情報としてGroupモデルのto_labelで指定した内容で一覧が以下のような感じで表示されます。
id | group | name |
---|---|---|
1 | g1:xxx | aaa |
2 | g1:xxx | bbb |
2 | g2:yyy | ccc |
ここで表示順を以下のようにgroups.codeで降順にして、さらにuser.nameの昇順にしたいとするとします。
id | group | name |
---|---|---|
2 | g2:yyy | ccc |
1 | g1:xxx | aaa |
2 | g1:xxx | bbb |
そのためにUserControllerに以下を追加します。
config.list.sorting = [{:group => :desc},{:name => :asc}]
でも、これでは以下のエラーが出てダメなのです。
Can't mix :method- and :sql-based sorting
それぞれ単独ならば問題なく動きます。
どうやらデフォルトでは、直接表示させているモデルに関するデータでソートする場合は、sqlでソートさせているのですが 関連するモデルの情報でソートする際は、データを持ってきてからActiveScaffold側でソートしているようです。
そしてソート手段が混ざるとダメなようです。
これをなんとかするには、以下のようにgroupsも検索対象に含めるように明示します。
config.columns[:group].includes = [:group]
config.columns[:group].sort_by :sql => "groups.code"
これでソートができるようになりました。
最終的なコントローラーは以下のような感じです。
class UsersController < ApplicationController active_scaffold :user do |config| config.columns = [:id, :group, :name] config.columns[:group].form_ui = :select config.columns[:group].includes = [:group] config.columns[:group].sort_by :sql => "groups.code" config.list.sorting = [{:group => :desc},{:name => :asc}] end end
0 件のコメント:
コメントを投稿