

お世話になっています。  
ActiveRecordについて教えて下さい。

ActiveRecordではカラムの命名規則に従えば自動でリレーションを組んだりデータを挿入してくれたりしますが、既存のデータベースを使いたいとき、カラムの設定はどのようにしたらよいのでしょうか。

例えば`created_at`を`created`というカラムに適用する場合など。

またこの情報を調べる際に使える関連するような検索ワードなどを教えていただけますか。

よろしくお願いします。

追記:

今回データの修正を行う作業が発生し、ActiveRecordを使ってプログラムを組んでしまうのが楽だと感じたのでこのような手段を思いつきました。一度きりのプログラムなので、カラムはいじらずにやりたいと考えております。


CC BY-SA 3.0
2015-01-27T01:25:30.873
5379
2015-01-27T10:30:38.187
2015-01-27T06:36:20.927
7339
7339
question
rails-activerecord
ActiveRecordで命名規則に合わないカラムを設定する方法


調べてみたところ、 `alias_attribute` メソッドを使うと良いようです。（使ったことはありませんが）

[code]

    class Movie < ActiveRecord::Base
      alias_attribute :created_at, :created
    end
    
[/code]

  * <https://stackoverflow.com/questions/1162079/how-to-override-activerecords-default-attribute-column-associations>

ですが、`created_at` は特別なカラムなので、上の方法ではうまくいかないかもしれません。  
下記のページにはいろいろとハック方法が載っています。

  * <https://stackoverflow.com/questions/733630/renaming-the-created-at-updated-at-columns-of-activerecord-rails>

が、これまた試したことはないですし、情報もちょっと古いので最近のRailsでちゃんと動くかどうかはわかりません。

一般論として、Railsは「レールに乗る」つまり、Railsのルールに従って作ったときが最も生産性が高くなります。  
ご質問の内容は「レールから外れた」使い方になるので、あまりこういうハックに頼らず、できるだけ実装をRailsに合わせることをオススメします。

ちなみに今回使った検索キーワードはこんな感じです。

  * activerecord override column name
  * activerecord alias name created_at

ご参考までに。


CC BY-SA 3.0
2015-01-27T01:42:40.237
5380
2015-01-27T01:42:40.237
2017-05-23T12:38:55.250
-1
85
5379
answer


# 特定のモデルのみに適用

ここでは、モデルのクラスに直接書いていますが、数が多い場合には適当に継承させると良いかもしれません。

## `before_***` を利用

[code]

    class User < ActiveRecord::Base
      before_create :set_created
      before_save :set_updated
    
      private
    
      def set_created
        self.created = DateTime.now
      end
    
      def set_updated
        self.updated = DateTime.now
      end
    end
    
[/code]

## メソッドを上書き

[code]

    class User < ActiveRecord::Base
      private
    
      def timestamp_attributes_for_update
        super + [:updated]
      end
    
      def timestamp_attributes_for_create
        super + [:created]
      end
    end
    
[/code]

# 全てのモデルに対して適用

全てのモデルで変更したい場合は、ActiveRecord::Timestamp
のメソッドを上書きすると良いかもしれません。具体的には、config/initializers 以下のファイルで指定します。(ファイル名は任意です。)

[code]

    # config/initializers/set_activerecord_timestamps.rb
    module ActiveRecord
      module Timestamp
        def timestamp_attributes_for_update
          [:updated_at, :updated_on, :updated]
        end
    
        def timestamp_attributes_for_create
          [:created_at, :created_on, :created]
        end
      end
    end
    
[/code]

cf.
<https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/timestamp.rb>

# その他

ActivaRecord::Base を直接変更する方法もあります。(`before_***`
を使う方法、メソッドを上書きするのどちらでもいけるはずです。) また、DBのカラム名を変更してRailsに合わせる方法も検討すると良いでしょう。


CC BY-SA 3.0
2015-01-27T02:02:32.940
5384
2015-01-27T10:30:38.187
2015-01-27T10:30:38.187
76
76
5379
answer