なんでafter使えないんだこんちくしょう!
んで、RailsもRailsでModelでカラムの一覧を定義するようなところがないので、そこで順番を定義することもできないと。
(Railsについては調べきれていないだけかもしれないけど)
やりたいこと
後からMigrationを追加すると、ActiveAdminの詳細ページとかでこうなってしまう。
後から追加した「画像」カラムに追加位置を指定できないので、「更新日」の後ろに追加されてしまった。かっこわるい。
もちろん、DSLでshow do row: id...
なんちゃらとやっていけば任意の順番で表示できるけど、めんどくさい。そういうことをしたくないんだ。ほんとにもう。
後からもっとカラム追加した時とかここ修正するの絶対忘れるし。
ということで、ActiveRecordの低層な部分でカラムの順番をなんとか動かせないかな。という記事です。
ソースサンプル
ダウンロード
[Rails][ActiveRecord][PostgreSQL] sort columns / Gist
ソース
config/initializers/extensions/active_record/attributes.rb
#
# config/initializers/extensions/active_record/attributes.rb
# https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/attributes.rb
#
module ActiveRecord #:nodoc:
module Attributes # :nodoc:
module ClassMethods
# Overriding method
def columns
# @columns ||= add_user_provided_columns(connection.schema_cache.columns(table_name)) #Original
@columns ||= add_user_provided_columns(connection.schema_cache.columns(table_name).sort!(&scheme_comparator))
end
private
# New method
def scheme_comparator
lambda do |a,b|
a.name.end_with?("_at") ?
(b.name.end_with?("_at") ? 0 : 1) :
(b.name.end_with?("_at") ? -1 : 0)
end
end
end
end
end
できた
といっても無理矢理ですけど!
(厳密にcreated_atとupdated_atだけにしたい場合は適宜変更してください)
でも
よく見たらこれ、columnにアクセスする度に毎回sortしてる?
要改良!