LoginSignup
0
0

More than 5 years have passed since last update.

[Rails] PostgreSQLでカラム追加時にafterが使えないのでなんとかがんばる

Last updated at Posted at 2016-08-19

なんでafter使えないんだこんちくしょう!
んで、RailsもRailsでModelでカラムの一覧を定義するようなところがないので、そこで順番を定義することもできないと。
(Railsについては調べきれていないだけかもしれないけど)

やりたいこと

後からMigrationを追加すると、ActiveAdminの詳細ページとかでこうなってしまう。

image

後から追加した「画像」カラムに追加位置を指定できないので、「更新日」の後ろに追加されてしまった。かっこわるい。

もちろん、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だけにしたい場合は適宜変更してください)

image

でも

よく見たらこれ、columnにアクセスする度に毎回sortしてる?
要改良!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0