Programing

Rails — STI없이 타입 컬럼을 사용 하시겠습니까?

lottogame 2020. 10. 14. 07:19
반응형

Rails — STI없이 타입 컬럼을 사용 하시겠습니까?


나는라는 열을 사용하려면 type단일 테이블 상속을 호출하지 않고 (STI) - 나는 단지 원하는 type보유하고 정상적인 열 수 String.

Rails가 단일 테이블 상속을 기대하고 예외를 던지지 않고 어떻게 할 수 The single-table inheritance mechanism failed to locate the subclass...This error is raised because the column 'type' is reserved for storing the class in case of inheritance.있습니까?

이를 수행하는 방법에 대한 아이디어가 있습니까?


Rails 3.1 set_inheritance_column은 더 이상 사용되지 않으며 nil다음과 같이 이름으로 사용할 수도 있습니다 .

class Pancakes < ActiveRecord::Base
    self.inheritance_column = nil
    #...
end

다음을 사용하여 STI 열 이름을 재정의 할 수 있습니다 set_inheritance_column.

class Pancakes < ActiveRecord::Base
    set_inheritance_column 'something_you_will_not_use'
    #...
end

따라서 아무것도 사용하지 않을 열 이름을 선택하고 set_inheritance_column.


나는이 질문이 다소 오래되었고 이것은 당신이 묻는 질문과 약간 다르다는 것을 알고 있지만, 열 유형이나 something_type의 이름을 지정하려는 충동을 느낄 때마다 항상하는 것은 유형의 동의어를 검색하고 대신 사용하는 것입니다.

다음은 몇 가지 대안입니다 : 종류, 정렬, 다양성, 카테고리, 세트, ​​장르, 종, 순서 등.


Rails 4.x

Rails 4에서 문제가 발생 했지만 Rails 4 에서는 set_inheritance_column메서드가 전혀 존재하지 않으므로 사용할 수 없습니다.

나를 위해 일한 해결책은 다음과 같이 ActiveRecordinheritance_column메서드 를 재정 의하여 단일 테이블 상속을 비활성화하는 것입니다.

class MyModel < ActiveRecord::Base

  private

  def self.inheritance_column
    nil
  end

end

도움이 되었기를 바랍니다.


모든 모델에 대해이 작업을 수행하려면 이니셜 라이저에이를 고정 할 수 있습니다.

ActiveSupport.on_load(:active_record) do
  class ::ActiveRecord::Base
    # disable STI to allow columns named "type"
    self.inheritance_column = :_type_disabled
  end
end

참고 URL : https://stackoverflow.com/questions/7134559/rails-use-type-column-without-sti

반응형