Programing

ActiveRecord 오브젝트에서 속성 유형 가져 오기

lottogame 2020. 11. 27. 07:37
반응형

ActiveRecord 오브젝트에서 속성 유형 가져 오기


프로그래밍 방식으로 유형 (AR에 의해 알려진-예 : 마이그레이션 스크립트 및 데이터베이스)을 가져올 수 있는지 알고 싶습니다 (데이터가 어딘가에 있다는 것을 알고 있습니다).

예를 들어, 모든 속성 이름을 다룰 수 있습니다.

ar.attribute_names.each { |name| puts name }

.attributes는 현재 값에 대한 이름 매핑 만 반환합니다 (예 : 필드가 설정되지 않은 경우 유형 정보 없음).

유형 정보와 함께 본 일부 장소 :

스크립트 / 콘솔에서 AR 엔티티의 이름을 입력하십시오.

>> Driver
=> Driver(id: integer, name: string, created_at: datetime, updated_at: datetime)

그래서 분명히 유형을 알고 있습니다. 또한 .column_for_attribute는 속성 이름을 취하고 열 개체를 반환합니다.이 형식은 기본 데이터베이스 열 개체에 묻혀 있지만 깔끔하게 가져 오는 방법은 아닙니다.

또한 다가오는 새로운 "ActiveModel"(rails3)에 친숙하고 데이터베이스 세부 사항에서 분리 된 방법이 있는지도 관심이있을 것입니다 (하지만 유형 정보가 그 일부가 아닐 수도 있습니다. 있는지 알아보십시오).

감사.


Rails 3에서 "Driver"모델에 대해 Driver.columns_hash.

Driver.columns_hash["name"].type  #returns :string

반복하려면 다음과 같이하면됩니다.

Driver.columns_hash.each {|k,v| puts "#{k} => #{v.type}"}

다음을 출력합니다.

id => integer
name => string
created_at => datetime
updated_at => datetime

다음을 수행하여 열 유형에 액세스 할 수 있습니다.

#script/console
Driver.columns.each {|c| puts c.type}

특정 모델의 모든 열 유형 목록을 얻으려면 다음을 수행 할 수 있습니다.

Driver.columns.map(&:type) #gets them all
Driver.columns.map(&:type).uniq #gets the unique ones

Rails 5에서는 데이터베이스와 관계없이이를 수행 할 수 있습니다. 새 속성 API를 사용하여 (추가) 속성을 정의하는 경우 중요합니다.

모델 클래스에서 모든 속성 가져 오기 :

pry> User.attribute_names
=> ["id",
 "firstname",
 "lastname",
 "created_at",
 "updated_at",
 "email",...

유형 얻기 :

pry> User.type_for_attribute('email')
=> #<ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::MysqlString:0x007ffbab107698
 @limit=255,
 @precision=nil,
 @scale=nil>

때로는 필요한 것보다 더 많은 정보입니다. 이러한 모든 유형을 핵심 세트 (: integer, : string 등)로 매핑하는 편리한 함수가 있습니다.

> User.type_for_attribute('email').type
=> :string 

'name': type해시 를 반환하는 attribute_types를 사용하여 한 번의 호출로 모든 데이터를 가져올 수도 있습니다 .


rails 5에서는 데이터 유형과 함께 모든 필드 이름의 목록을 제공합니다.

Model_Name.attribute_names.each do |k| puts "#{k} = #{Model_Name.type_for_attribute(k).type}" end

이 스 니펫은 해시에서 연관된 데이터베이스 데이터 유형과 함께 모델의 모든 속성을 제공합니다. Post를 Active Record 모델로 바꾸십시오.

Post.attribute_names.map {|n| [n.to_sym,Post.type_for_attribute(n).type]}.to_h

이와 같은 해시를 반환합니다.

=> {:id=>:integer, :title=>:string, :body=>:text, :created_at=>:datetime, :updated_at=>:datetime, :topic_id=>:integer, :user_id=>:integer} 

참고 URL : https://stackoverflow.com/questions/2399556/getting-types-of-the-attributes-in-an-activerecord-object

반응형