[RUBY-ON-RAILS] 액티브 / 레일의 updated_at 컬럼의 created_at 이름 바꾸기
RUBY-ON-RAILS액티브 / 레일의 updated_at 컬럼의 created_at 이름 바꾸기
나는 timestamp.rb에 정의 된 타임 스탬프 열 이름을 변경합니다. timestamp.rb의 방법은 덮어 쓸 수 있습니다? 그리고 무엇을 가지고하는 것은 덮어 쓴 방법과 모듈이 사용하는 응용 프로그램에서 수행 할 수 있습니다.
해결법
-
==============================
1.이 작업을 수행하는 간단한 방법은 없습니다. 당신이, 또는 당신을 위해 마술을 할 수있는 당신의 자신의 경로를 작성하여 액티브 :: 타임 스탬프 모듈을 재정 의하여 중이 작업을 수행 할 수 있습니다.
이 작업을 수행하는 간단한 방법은 없습니다. 당신이, 또는 당신을 위해 마술을 할 수있는 당신의 자신의 경로를 작성하여 액티브 :: 타임 스탬프 모듈을 재정 의하여 중이 작업을 수행 할 수 있습니다.
여기에 마법이 작동하는 방법이다.
-
==============================
2.나는 NPatel의 방법은 올바른 접근이라고 생각하지만, 당신은 단지 하나의 모델 변경 #created_at해야하는 경우가 너무 많이하고있다. 타임 스탬프 모듈은 모든 AR 오브젝트에 포함되어 있기 때문에, 당신은 단지 모델 당을 오버라이드 (override)하지 세계적으로 수 있습니다.
나는 NPatel의 방법은 올바른 접근이라고 생각하지만, 당신은 단지 하나의 모델 변경 #created_at해야하는 경우가 너무 많이하고있다. 타임 스탬프 모듈은 모든 AR 오브젝트에 포함되어 있기 때문에, 당신은 단지 모델 당을 오버라이드 (override)하지 세계적으로 수 있습니다.
<= 5.0 레일
class User < ActiveRecord::Base ... private def timestamp_attributes_for_create super << :registered_at end end
~> 5.1 레일
private_class_method def self.timestamp_attributes_for_create # only strings allowed here, symbols won't work, see below commit for more details # https://github.com/rails/rails/commit/2b5dacb43dd92e98e1fd240a80c2a540ed380257 super << 'registered_at' end end
-
==============================
3.이것은 단지를 통해 액티브 :: 타임 스탬프 모듈 방법을 쓰기를 통해 수행 할 수 있습니다. 실제로 전체 모듈을 덮어 쓰지 않습니다. 나는 레거시 데이터베이스 작업을하고 나는이 같은 목표를 달성하기 위해해야합니다. 나는 레일 3와 나는 원숭이에 쓰기 기능을 레일을 통해 내 코드를 패치하는 방법의 방법론 다음 시작했습니다.
이것은 단지를 통해 액티브 :: 타임 스탬프 모듈 방법을 쓰기를 통해 수행 할 수 있습니다. 실제로 전체 모듈을 덮어 쓰지 않습니다. 나는 레거시 데이터베이스 작업을하고 나는이 같은 목표를 달성하기 위해해야합니다. 나는 레일 3와 나는 원숭이에 쓰기 기능을 레일을 통해 내 코드를 패치하는 방법의 방법론 다음 시작했습니다.
내가 먼저 초기화에 있음라는 파일을 내가 함께 일하고있는 기본 프로젝트를 생성하고 생성합니다. 이 경우에는 내가 active_record.rb를 만들었습니다. 그리고 파일 내에서 나는 타임 스탬프를 제어하는 두 가지 방법을 무시하는 코드를 넣습니다. 다음은 내 코드의 샘플입니다 :
module ActiveRecord module Timestamp private def timestamp_attributes_for_update #:nodoc: ["updated_at", "updated_on", "modified_at"] end def timestamp_attributes_for_create #:nodoc: ["created_at", "created_on"] end end end
참고 : 나는 것 또한 원숭이 패치 이런 종류의 눈살을 찌푸리게되는 일에 물건을 얻을 및 업그레이드에 중단 될 수 있으므로주의하고 당신이 원하는 것이 무엇인지 숙지 할 것을 언급하고있다.
업데이트 :
-
==============================
4.당신은 당신의 특정 컬럼에 DateTime.now을 게시 할를 BeforeSave와 beforecreate 방법을 사용할 수 있습니다.
당신은 당신의 특정 컬럼에 DateTime.now을 게시 할를 BeforeSave와 beforecreate 방법을 사용할 수 있습니다.
class Sample < ActiveRecord::Base before_create :set_time_stamps before_save :set_time_stamps private def set_time_stamps self.created_column = DateTime.now if self.new_record? self.updated_column = DateTime.now end end
-
==============================
5.원하는 열 이름과 CREATED_COL 및 UPDATED_COL 상수의 값을 대체 APPEND으로 environment.rb에 다음 빠른 추한 해킹, 밀란 Novota의 대답에서 정교화 :
원하는 열 이름과 CREATED_COL 및 UPDATED_COL 상수의 값을 대체 APPEND으로 environment.rb에 다음 빠른 추한 해킹, 밀란 Novota의 대답에서 정교화 :
module ActiveRecord module Timestamp CREATED_COL = 'created_at' UPDATED_COL = 'updated_at' private def create_with_timestamps #:nodoc: if record_timestamps t = self.class.default_timezone == :utc ? Time.now.utc : Time.now write_attribute(CREATED_COL, t) if respond_to?(CREATED_COL) && send(CREATED_COL).nil? write_attribute(UPDATED_COL, t) if respond_to?(UPDATED_COL) && send(UPDATED_COL).nil? end create_without_timestamps end def update_with_timestamps(*args) #:nodoc: if record_timestamps && (!partial_updates? || changed?) t = self.class.default_timezone == :utc ? Time.now.utc : Time.now write_attribute(UPDATED_COL, t) if respond_to?(UPDATED_COL) end update_without_timestamps(*args) end end end
-
==============================
6.레일> = 5.1에 대한 업데이트 된 대답. 나는 응용 프로그램에서 기본적으로 사용할 수있는 ApplicationRecord를 사용하는 것이 좋습니다하고 다음을 정의합니다 :
레일> = 5.1에 대한 업데이트 된 대답. 나는 응용 프로그램에서 기본적으로 사용할 수있는 ApplicationRecord를 사용하는 것이 좋습니다하고 다음을 정의합니다 :
class ApplicationRecord < ActiveRecord::Base self.abstract_class = true class << self private def timestamp_attributes_for_create super << 'my_created_at_column' end def timestamp_attributes_for_update super << 'my_updated_at_column' end end end
당신의 모든 모델을 구성하고자하는 경우, 당신은 또한 특정 모델에이 블록을 사용할 수 있습니다.
당신이 문자열이 아니라 기호를 사용한다는 것을 유의하십시오.
-
==============================
7.이있는 작업을 수행하기위한 정확한 구문 4.2 레일
이있는 작업을 수행하기위한 정확한 구문 4.2 레일
class User < ActiveRecord::Base ... private def timestamp_attributes_for_create super << 'date_add' end def timestamp_attributes_for_update super << 'date_update' end end
-
==============================
8.또는 당신은 당신이 만들 때 자신의 열 (날짜 시간) 그냥 수동으로 설정 created_at 열을 확인하고 업데이트 할 때 updated_at 열을 설정할 수 있습니다. 즉 위의 해킹보다 더 쉬울 수 있습니다. 그건 내가 뭘할지. 더 나은 아직, 업데이트는 우리가이 이름을 변경할 수 있도록 레일.
또는 당신은 당신이 만들 때 자신의 열 (날짜 시간) 그냥 수동으로 설정 created_at 열을 확인하고 업데이트 할 때 updated_at 열을 설정할 수 있습니다. 즉 위의 해킹보다 더 쉬울 수 있습니다. 그건 내가 뭘할지. 더 나은 아직, 업데이트는 우리가이 이름을 변경할 수 있도록 레일.
-
==============================
9.원숭이 패치를 사용하지 않는 sol'n; 마이그레이션 중에 가역적 블록을 사용 :
원숭이 패치를 사용하지 않는 sol'n; 마이그레이션 중에 가역적 블록을 사용 :
class CreateTest < ActiveRecord::Migration def change create_table :test do |t| end # set the timestamp columns default to now() reversible do |dir| dir.up do tables = [ :test ] tables.each do |t| execute <<-SQL ALTER TABLE #{t.to_s} add column created timestamp without time zone default now(); SQL execute <<-SQL ALTER TABLE #{t.to_s} add column updated timestamp without time zone default now(); SQL end end dir.down do # no need to do anything, the rollback will drop the tables end end end end
from https://stackoverflow.com/questions/733630/renaming-the-created-at-updated-at-columns-of-activerecord-rails by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] railties을 찾을 수 없습니다 : 난간 (0) | 2020.02.14 |
---|---|
[RUBY-ON-RAILS] "빈은 / 레일 : 없음 같은 파일 또는 디렉터리"Heroku가에 / 루비 2 개 레일 4w를 (0) | 2020.02.14 |
[RUBY-ON-RAILS] 유증 4.0 레일. 중첩은 Unpermited 매개 변수 속성 (0) | 2020.02.14 |
[RUBY-ON-RAILS] RoR에의 검증과 정규 표현식 4 (0) | 2020.02.14 |
[RUBY-ON-RAILS] 응용 프로그램 / 자산의 모든 CSS와 JS 파일을 처리 할 수 config.assets.precompile 설정을 레일 (0) | 2020.02.14 |