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}
'Programing' 카테고리의 다른 글
Autofac : 유형의 모든 인스턴스 해결 (0) | 2020.11.27 |
---|---|
명령 줄에서 Zend Framework 작업 실행 (0) | 2020.11.27 |
document.body.scrollTop은 스크롤 할 때도 IE에서 항상 0입니다. (0) | 2020.11.27 |
모든 mysql 테이블을 별도의 파일에 자동으로 덤프합니까? (0) | 2020.11.27 |
함수를 루프에서 한 번만 실행하는 효율적인 방법 (0) | 2020.11.27 |