2012-06-07 5 views
4

나는 루비 객체가 인스턴스 변수 (및 클래스 포인터)를 저장할 수있는 장소에 있다는 것을 읽었습니다. 그래서 : 이제Ruby 인스턴스 변수 대 ActiveRecord 속성

class Person 
    def initialize(age) 
    @age = age 
    end 
end 

우리가 실행하는 경우 :

p = Person.new(101) 

그리고 우리가 얻을 :

#<Person:0x86cf5b8 @age=101> 

위대한 예상대로 재산 나이예 변수로 저장됩니다 . 그러나 모델을 ActiveRecord에서 상속하도록 변환하면 상황이 조금 다르게 작동합니다.

# timestamps removed 
#<Person id: 1, age: 101 > 

나이 속성은 더 이상 인스턴스 변수로 나타납니다 이제 새로운 사람을 인스턴스화 한 후, 우리는이 볼 수 없습니다. 그래서 여기서 실제로 무엇이 일어나고 있습니까?

모든 속성과 값의 해시가 포함 된 @attributes 인스턴스 변수에 액세스 할 수 있다는 것을 알고 있습니다. 따라서 ActiveRecord가 콘솔 출력을 수정하여이 방법으로 개체 특성을 표시하는지 궁금합니다.

ActiveRecord를 사용하지 않고 프로퍼티가 인스턴스 변수가 아닌 속성으로 유지되는 Ruby 객체를 인스턴스화 할 수 있습니까?

+0

질문에서 "AR"클래스가 아닌 "속성"대 "인스턴스 변수"는 무엇입니까? –

+0

Dave Thomas는 비디오에서 객체는 인스턴스 변수의 모음임을 명시했습니다. 그러나 ActiveRecord 객체는 속성을 인스턴스 변수로 저장하지 않으므로 다소 혼란 스럽습니다. – stephenmurdoch

+1

왜? AR 객체는 일반 Ruby 객체가 아니며 유지되어야하는 속성은 없어야하는 속성과 구별되어야합니다. 다른 구현 메커니즘 *이 사용되었지만 사용할 수 없습니다. –

답변

3

예, include ActiveModel::AttributeMethods을 사용하여 루비 클래스를 확장하여 인스턴스 변수를 ActiveModel과 같은 특성으로 나타낼 수 있습니다.

See the docs 자세한 내용은

+0

굉장한 데, 지금 더 의미가 있습니다. – stephenmurdoch

1

'인스턴스를 저장하는'속성에서 볼 수 있듯이 인스턴스 변수는 사용자 자신의 작업 이었으므로 다른 방식으로 유지하려는 경우에는 사용자가 결정해야합니다. 루비는 attr_accessor와 같은 getter와 setter 메소드를 정의하는 편리한 클래스 메소드를 제공합니다.

ActiveRecord :: Base에서 상속받은 경우 initialize를 재정의해서는 안됩니다.

+0

감사합니다. 데이브 토마스의 말은 "객체는 인스턴스 변수의 모음입니다"라는 의미로 다른 것들은 사용할 수 없지만, 지금은 조금 더 있습니다. – stephenmurdoch

0

ActiveRecord가 콘솔 출력을 수정하여이 방법으로 개체 특성을 표시하는지 궁금합니다.

글쎄, 종류. 그 담당하는 방법 inspectit's implemented by Object 방법이 (emplasis 광산)에 있습니다

는 ... 객체의 클래스 명, 오브젝트 ID의 부호화를 나타내고, 인스턴스 변수 목록 그들의 값은입니다 (각각에 inspect를 호출 함).

사용자 정의 클래스는 OBJ의 더 나은 표현을 제공하기 위해이 메소드를 오버라이드 (override) :

후 더 권리가있다.

이것은 정확히 ActiveRecord의 기능이며이 출력이 표시되는 이유입니다. 재정의 된 메서드는 인스턴스 변수를 나열하지 않지만 AR 특성을 표시합니다.

콘솔에 인스턴스 변수가 표시되지 않는다고해서 거기에 없다는 것을 의미하지는 않습니다!

관련 문제