[RUBY-ON-RAILS] 어떻게 레일에서 기본값을 설정하는 방법?
RUBY-ON-RAILS어떻게 레일에서 기본값을 설정하는 방법?
나는 레일에서 객체에 대한 설정 기본값으로 최선의 방법을 찾기 위해 노력하고있어.
내가 생각할 수있는 최선은 컨트롤러의 새로운 방법의 기본 값을 설정하는 것입니다.
이 허용되는 경우, 또는 그것을 할 수있는 더 좋은 방법이 있다면 사람이 어떤 입력이 있습니까?
해결법
-
==============================
1."올바른"루비에서 위험한 단어입니다. 아무것도 할 하나 이상의 방법은 일반적으로있다. 당신은 항상 그 테이블의 해당 컬럼에 디폴트 값을 할 것입니다 알고있는 경우 DB 마이그레이션 파일에 설정하는 가장 쉬운 방법입니다 :
"올바른"루비에서 위험한 단어입니다. 아무것도 할 하나 이상의 방법은 일반적으로있다. 당신은 항상 그 테이블의 해당 컬럼에 디폴트 값을 할 것입니다 알고있는 경우 DB 마이그레이션 파일에 설정하는 가장 쉬운 방법입니다 :
class SetDefault < ActiveRecord::Migration def self.up change_column :people, :last_name, :type, :default => "Doe" end def self.down # You can't currently remove default values in Rails raise ActiveRecord::IrreversibleMigration, "Can't remove the default" end end
액티브가 테이블 및 열 특성을 자동 탐지하기 때문에,이 표준 레일 응용 프로그램에서 사용 동일한 기본은 모든 모델에서 설정하게됩니다.
당신은 기본적으로 특정의 경우에 설정 값을하려는 경우, - 말을, 일부 다른 사람들과 테이블을 공유한다는 상속 모델의 - 후 다른 우아한 방법은 모델 객체가 생성 될 때 레일 코드에서 직접 할 수있다는 :
class GenericPerson < Person def initialize(attributes=nil) attr_with_defaults = {:last_name => "Doe"}.merge(attributes) super(attr_with_defaults) end end
당신이 GenericPerson.new ()를 할 때, 그 위치에 다른 내용을 무시하지 않는 한 다음, 항상 Person.new ()에 "미상"속성을 조금씩 것이다.
-
==============================
2.SFEley의 답변에 따라, 여기에 새로운 레일 버전에 대한 업데이트 / 고정 하나입니다 :
SFEley의 답변에 따라, 여기에 새로운 레일 버전에 대한 업데이트 / 고정 하나입니다 :
class SetDefault < ActiveRecord::Migration def change change_column :table_name, :column_name, :type, default: "Your value" end end
-
==============================
3.먼저 초기화에 과부하가 걸리지 수있는 모든 (* 인수)의 그것은 모든 경우에 호출되지 것 같이.
먼저 초기화에 과부하가 걸리지 수있는 모든 (* 인수)의 그것은 모든 경우에 호출되지 것 같이.
당신의 최선의 선택은 마이그레이션으로 기본값을 넣어하는 것입니다 :
add_column :accounts, :max_users, :integer, :default => 10
둘째 최고의 모델로 자리 기본값으로하지만 처음 전무 속성이 의지 만 작동합니다. 내가 부울 열이 그랬던 것처럼 당신은 문제가있을 수 있습니다 :
def after_initialize if new_record? max_users ||= 10 end end
당신은 new_record이 필요하십니까? 그래서 기본값은 데이터베이스에서로드 값을 대체하지 않습니다.
당신은 initialize 메소드에 전달 된 매개 변수를 오버라이드 (override)에서 레일을 중지 = ||해야합니다.
-
==============================
4.당신은 또한 (레일 3.2.8에서 테스트) 당신의 마이그레이션에 change_column_default을 시도 할 수 있습니다 :
당신은 또한 (레일 3.2.8에서 테스트) 당신의 마이그레이션에 change_column_default을 시도 할 수 있습니다 :
class SetDefault < ActiveRecord::Migration def up # Set default value change_column_default :people, :last_name, "Smith" end def down # Remove default change_column_default :people, :last_name, nil end end
change_column_default는 API 문서를 레일
-
==============================
5.당신은 액티브 오브젝트를 참조하는 경우, 당신은이 일을 두 가지 방법 (보다 더)가 :
당신은 액티브 오브젝트를 참조하는 경우, 당신은이 일을 두 가지 방법 (보다 더)가 :
EG
class AddSsl < ActiveRecord::Migration def self.up add_column :accounts, :ssl_enabled, :boolean, :default => true end def self.down remove_column :accounts, :ssl_enabled end end
여기에 더 많은 정보 : http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
예를 들면 before_validation_on_create
여기에 더 많은 정보 : http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M002147
-
==============================
6.(가) after_initialize 액티브 콜백, 새 개체에 대한 기본 값을 할당합니다 모델의 메소드를 호출 할 수 있습니다 사용하여 레일 v3.2.8에 루비합니다.
(가) after_initialize 액티브 콜백, 새 개체에 대한 기본 값을 할당합니다 모델의 메소드를 호출 할 수 있습니다 사용하여 레일 v3.2.8에 루비합니다.
그래서, IMO는 같이 보일 것이다 :
class Foo < ActiveRecord::Base after_initialize :assign_defaults_on_new_Foo ... attr_accessible :bar ... private def assign_defaults_on_new_Foo # required to check an attribute for existence to weed out existing records self.bar = default_value unless self.attribute_whose_presence_has_been_validated end end
Foo.bar = DEFAULT_VALUE이 인스턴스의 인스턴스가이 저장 / 업데이트에 이전 attribute_whose_presence_has_been_validated 포함하지 않는. DEFAULT_VALUE는 바 속성에 대한 DEFAULT_VALUE를 사용하여 양식을 렌더링하는보기와 함께 사용됩니다.
기껏이 해키 ...
대신 속성 값을 검사의 new_record를 사용할 수 있습니까? 내장 레일 방법. 따라서, 위의 예처럼 보일 것입니다 :
class Foo < ActiveRecord::Base after_initialize :assign_defaults_on_new_Foo, if: 'new_record?' ... attr_accessible :bar ... private def assign_defaults_on_new_Foo self.bar = default_value end end
이 훨씬 청소기입니다. 아, 레일의 마법 - 그것은 나보다 더 똑똑합니다.
-
==============================
7.레일 3.2.6에서 부울 필드의 경우 적어도,이 마이그레이션에서 작동합니다.
레일 3.2.6에서 부울 필드의 경우 적어도,이 마이그레이션에서 작동합니다.
def change add_column :users, :eula_accepted, :boolean, default: false end
이 부울 필드이기 때문에 기본에 대한 1 또는 0을 두는 것은, 여기에 작동하지 않습니다. 그것은 참 또는 거짓 값이어야합니다.
-
==============================
8.당신이 모델 상대하고있는 경우에, 당신은 레일의 속성들을 사용할 API를 사용할 수 5+ http://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute
당신이 모델 상대하고있는 경우에, 당신은 레일의 속성들을 사용할 API를 사용할 수 5+ http://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute
단지 적절한 열 이름으로 마이그레이션을 추가 한 다음 모델로 설정 :
class StoreListing < ActiveRecord::Base attribute :country, :string, default: 'PT' end
-
==============================
9.마이그레이션 및 사용 change_column_default, 간결하고 가역 생성 :
마이그레이션 및 사용 change_column_default, 간결하고 가역 생성 :
class SetDefaultAgeInPeople < ActiveRecord::Migration[5.2] def change change_column_default :people, :age, { from: nil, to: 0 } end end
-
==============================
10.그냥 내가 SQL 기본 열 값을 사용하는 것이 좋습니다 것 데이터베이스 백업 모델의 특정 속성에 대한 기본값을 설정하는 경우 - 당신은 당신이 사용하고있는 디폴트의 유형을 명확히 할 수 있습니까?
그냥 내가 SQL 기본 열 값을 사용하는 것이 좋습니다 것 데이터베이스 백업 모델의 특정 속성에 대한 기본값을 설정하는 경우 - 당신은 당신이 사용하고있는 디폴트의 유형을 명확히 할 수 있습니까?
그것을 처리하는 방법의 수, 흥미로운 옵션 등이 플러그인 모습이있다.
-
==============================
11.제안은 초기화 불완전 아마 / 새 오버라이드 (override)합니다. 레일 (자주) 호출은 초기화 호출이 유발되지 않음을 할당하는 액티브가 객체에 할당하고, 호출됩니다.
제안은 초기화 불완전 아마 / 새 오버라이드 (override)합니다. 레일 (자주) 호출은 초기화 호출이 유발되지 않음을 할당하는 액티브가 객체에 할당하고, 호출됩니다.
당신이 액티브 객체를 얘기하는 경우, after_initialize를 오버라이드 (override)를보십시오.
이 블로그 게시물 (안 내)은 유용합니다 :
기본 값 호출되지 기본 생성자
[편집 : SFEley는 메모리에 새로운 객체를 인스턴스화 할 때 레일이 실제로 데이터베이스의 기본에 모습을한다는 것을 지적한다 - 나는 것을 깨달았다하지 않았다.]
-
==============================
12.나는 그것이 DB에서 기본 열 값으로 지정된 것처럼 기본을 설정하는 데 필요한. 그것은 다음과 같이 작동합니다 그래서
나는 그것이 DB에서 기본 열 값으로 지정된 것처럼 기본을 설정하는 데 필요한. 그것은 다음과 같이 작동합니다 그래서
a = Item.new a.published_at # => my default value a = Item.new(:published_at => nil) a.published_at # => nil
after_initialize 콜백이 인수에서 속성을 설정 한 후 호출되기 때문에, 거기가 설정되지 않았기 때문에 속성이 전무의 경우 알 수있는 방법이 없었다거나 의도적으로 전무로 설정되어 있기 때문이다. 그래서 나는 조금 안에 찌를했고,이 간단한 솔루션을했다.
class Item < ActiveRecord::Base def self.column_defaults super.merge('published_at' => Time.now) end end
나를 위해 좋은 작동합니다. (레일 3.2.x)
-
==============================
13.제안 된 답변보다 잠재적으로 더 나은 / 청소기 잠재적 인 방법은 다음과 같이 접근을 덮어 쓸 수 있습니다 :
제안 된 답변보다 잠재적으로 더 나은 / 청소기 잠재적 인 방법은 다음과 같이 접근을 덮어 쓸 수 있습니다 :
def status self['name_of_var'] || 'desired_default_value' end
액티브 :: 자료 문서에서 더 많은 자체를 사용하는 방법에 StackOverflow의에서 "덮어 쓰기의 기본 접근"을 참조하십시오.
-
==============================
14.난 .. 여기 레일 attr_accessor_with_default을 사용하고이 작업을 수행 할 수있는 깨끗한 방법을 비슷한 질문에 대답
난 .. 여기 레일 attr_accessor_with_default을 사용하고이 작업을 수행 할 수있는 깨끗한 방법을 비슷한 질문에 대답
class SOF attr_accessor_with_default :is_awesome,true end sof = SOF.new sof.is_awesome => true
최신 정보
attr_accessor_with_default가 레일 3.2에서 사용되지 .. 당신은 순수 루비로 대신 할 수있다
class SOF attr_writer :is_awesome def is_awesome @is_awesome ||= true end end sof = SOF.new sof.is_awesome #=> true
-
==============================
15.당신이 액티브 객체를 얘기한다면, 나는 '속성 - 기본값은'보석을 사용합니다.
당신이 액티브 객체를 얘기한다면, 나는 '속성 - 기본값은'보석을 사용합니다.
문서 및 다운로드 : https://github.com/bsm/attribute-defaults
-
==============================
16.당신은 rails_default_value 보석을 사용할 수 있습니다. 예를 들면 :
당신은 rails_default_value 보석을 사용할 수 있습니다. 예를 들면 :
class Foo < ActiveRecord::Base # ... default :bar => 'some default value' # ... end
https://github.com/keithrowell/rails_default_value
-
==============================
17.당신은 액티브 모델의 생성자를 오버라이드 (override) 할 수 있습니다.
당신은 액티브 모델의 생성자를 오버라이드 (override) 할 수 있습니다.
이 같이 :
def initialize(*args) super(*args) self.attribute_that_needs_default_value ||= default_value self.attribute_that_needs_another_default_value ||= another_default_value #ad nauseum end
from https://stackoverflow.com/questions/1186400/how-to-set-default-values-in-rails by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 요청이 AJAX 인 경우 레일 감지 (0) | 2020.02.13 |
---|---|
[RUBY-ON-RAILS] 컨트롤러에서 실행 레이크 작업 (0) | 2020.02.13 |
[RUBY-ON-RAILS] 변수를 사용 YAML (0) | 2020.02.13 |
[RUBY-ON-RAILS] 어떻게 레일에서 다른 형식의 부분을 렌더링합니까? (0) | 2020.02.13 |
[RUBY-ON-RAILS] 이유에 대해 종종 추천 default_scope 레일을 사용? (0) | 2020.02.13 |