복붙노트

[RUBY-ON-RAILS] 어떻게 레일에서 기본값을 설정하는 방법?

RUBY-ON-RAILS

어떻게 레일에서 기본값을 설정하는 방법?

나는 레일에서 객체에 대한 설정 기본값으로 최선의 방법을 찾기 위해 노력하고있어.

내가 생각할 수있는 최선은 컨트롤러의 새로운 방법의 기본 값을 설정하는 것입니다.

이 허용되는 경우, 또는 그것을 할 수있는 더 좋은 방법이 있다면 사람이 어떤 입력이 있습니까?

해결법

  1. ==============================

    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. ==============================

    2.SFEley의 답변에 따라, 여기에 새로운 레일 버전에 대한 업데이트 / 고정 하나입니다 :

    SFEley의 답변에 따라, 여기에 새로운 레일 버전에 대한 업데이트 / 고정 하나입니다 :

    class SetDefault < ActiveRecord::Migration
      def change
        change_column :table_name, :column_name, :type, default: "Your value"
      end
    end
    
  3. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    7.레일 3.2.6에서 부울 필드의 경우 적어도,이 마이그레이션에서 작동합니다.

    레일 3.2.6에서 부울 필드의 경우 적어도,이 마이그레이션에서 작동합니다.

    def change
      add_column :users, :eula_accepted, :boolean, default: false
    end
    

    이 부울 필드이기 때문에 기본에 대한 1 또는 0을 두는 것은, 여기에 작동하지 않습니다. 그것은 참 또는 거짓 값이어야합니다.

  8. ==============================

    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. ==============================

    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. ==============================

    10.그냥 내가 SQL 기본 열 값을 사용하는 것이 좋습니다 것 데이터베이스 백업 모델의 특정 속성에 대한 기본값을 설정하는 경우 - 당신은 당신이 사용하고있는 디폴트의 유형을 명확히 할 수 있습니까?

    그냥 내가 SQL 기본 열 값을 사용하는 것이 좋습니다 것 데이터베이스 백업 모델의 특정 속성에 대한 기본값을 설정하는 경우 - 당신은 당신이 사용하고있는 디폴트의 유형을 명확히 할 수 있습니까?

    그것을 처리하는 방법의 수, 흥미로운 옵션 등이 플러그인 모습이있다.

  11. ==============================

    11.제안은 초기화 불완전 아마 / 새 오버라이드 (override)합니다. 레일 (자주) 호출은 초기화 호출이 유발되지 않음을 할당하는 액티브가 객체에 할당하고, 호출됩니다.

    제안은 초기화 불완전 아마 / 새 오버라이드 (override)합니다. 레일 (자주) 호출은 초기화 호출이 유발되지 않음을 할당하는 액티브가 객체에 할당하고, 호출됩니다.

    당신이 액티브 객체를 얘기하는 경우, after_initialize를 오버라이드 (override)를보십시오.

    이 블로그 게시물 (안 내)은 유용합니다 :

    기본 값 호출되지 기본 생성자

    [편집 : SFEley는 메모리에 새로운 객체를 인스턴스화 할 때 레일이 실제로 데이터베이스의 기본에 모습을한다는 것을 지적한다 - 나는 것을 깨달았다하지 않았다.]

  12. ==============================

    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. ==============================

    13.제안 된 답변보다 잠재적으로 더 나은 / 청소기 잠재적 인 방법은 다음과 같이 접근을 덮어 쓸 수 있습니다 :

    제안 된 답변보다 잠재적으로 더 나은 / 청소기 잠재적 인 방법은 다음과 같이 접근을 덮어 쓸 수 있습니다 :

    def status
      self['name_of_var'] || 'desired_default_value'
    end
    

    액티브 :: 자료 문서에서 더 많은 자체를 사용하는 방법에 StackOverflow의에서 "덮어 쓰기의 기본 접근"을 참조하십시오.

  14. ==============================

    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. ==============================

    15.당신이 액티브 객체를 얘기한다면, 나는 '속성 - 기본값은'보석을 사용합니다.

    당신이 액티브 객체를 얘기한다면, 나는 '속성 - 기본값은'보석을 사용합니다.

    문서 및 다운로드 : https://github.com/bsm/attribute-defaults

  16. ==============================

    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. ==============================

    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
    
  18. from https://stackoverflow.com/questions/1186400/how-to-set-default-values-in-rails by cc-by-sa and MIT license