모델에 특정 열 / 속성이 있는지 확인하는 방법은 무엇입니까?


123

해시를 반복하고 각 키가 모델 테이블에 있는지 확인해야하는 메서드가 있습니다. 그렇지 않으면 키 / 값이 삭제됩니다.

예를 들면

number_hash = { :one => "one", :two => "two" }

Number 테이블에는 : one 열만 있으므로 : two가 삭제됩니다.

모델에 속성이 있는지 여부를 어떻게 확인합니까?

답변:


205

수업 용

사용은 Class.column_names.include? attr_name어디에서 attr_name당신의 속성의 문자열 이름입니다.

이 경우 : Number.column_names.include? 'one'

예를 들어

사용 record.has_attribute?(:attr_name)또는 record.has_attribute?('attr_name')(레일 3.2 이상) 또는 record.attributes.has_key? attr_name.

이 경우 : number.has_attribute?(:one)또는 number.has_attribute?('one')또는number.attributes.has_key? 'one'


보너스 포인트 사용 Hash#select:number_hash.select { |key, value| Number.column_names.include? key }
hgmnz 2009

28
사용, 3.2 이상 레일에서 number.has_attribute?기호 나 문자열 받아
마크 - 앙드레 Lafortune

개체가 메서드를 다른 개체에 위임하면이 메서드는 열이 존재한다고 잘못 제안 할 것이라고 생각합니다. 나는 내 모델에.가있는 모델을 확인 user했지만 user_id일부 모델이 사용자를 위임했기 때문에 대신 찾아야했습니다 .
MattyB

Hash#has_key?찬성되지 않습니다Hash#key?
찰스 하멜

attribute_method 를 사용하는 것은 어떻 습니까? 수업 :Number.attribute_method? 'one'
ouranos

13

별칭도 확인해야하는 경우 Number.method_defined? attr_name또는number.class.method_defined? attr_name .

별칭 필드가있는 Mongoid 개체에 대해이 작업을 수행해야했습니다.


내가 찾은에게 ModelName.attribute_method? :attr_name내 인스턴스에서 일을 무엇 이었습니까
somedirection

10

인스턴스 객체에서 defined? instance.attribute또는 instance.respond_to? :attribute.
이들은 모델 속성 또는 모든 방법을 확인하는보다 일반적인 솔루션입니다.


3
명심하십시오 :instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
kbrock
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.