2014-05-13 2 views
2

모든 모델 인스턴스에는 #object_id 및 #id가 있습니다. 동일한 것은 아닙니다.object_id와 id의 차이점은 무엇입니까?

그러나 무엇이 서로 다른지와 어떻게 각각 문맥에서 사용되는지는 확실하지 않습니다.

삭제 해주세요.

감사합니다.

답변

2

, :id 당신이 custom foreign_key을 설정하지 않으면 foriegn_key을 할 수있는 table.And object_id의 기본 primary_key입니다.

예를 들어,에 국지적 인 관계가

user => has_many posts

post => belongs to user 

이 때문에 posts 테이블에, 우리는 foreign_key (이 경우 user_id에서)를 작성해야 될 것 usersposts이 두 테이블을 관계가 작동하도록하십시오.

희망이 있습니다.

1

id은 ActiveModel 레코드에 고유하며 데이터베이스의 id 열과 관련이 있습니다. object_id은 Object에서 정의되며 메모리에서 작성된 모든 단일 객체에 대해 고유합니다.

+0

미안하지만 분명히해야합니다. 개체는 자리 표시 자입니다. 다음을 고려해보십시오. product_id와 product.id의 차이점은 무엇입니까? 감사! – user3399101

+1

하하, 그건 당신의 질문의 성격을 완전히 바꿉니다! 내가 너라면이 질문을 삭제하고 덜 오해의 소지가있는 예제로 다시 시작하겠다. –

+1

@ user3399101 그것은 총 오도 된 것입니다! 실제로 id (primary_key)와 object_id (foreign_key)의 차이점을 찾으십니까? – Pavan

1

루비의 모든 것 (그리고 나는 모든 것을 의미 함)은 객체입니다. 이러한 각 객체에는 기본적으로 메모리에서 객체를 추적하는 데 사용되는 object_id가 있습니다.

레일스에서 ​​모델 인스턴스는 데이터베이스의 해당 열에서 해당 값을 반환하는 메서드로 자동 설정됩니다. .id 중 하나입니다.

문맥에서 사용하는 한 일반적으로 코드에서 object_id를 사용하지 않을 것입니다. 이는 언더 푸드 (under-the-hood) 문제입니다.

편집 - 옆으로, 일반적인 루비/레일의 이전 버전에서 볼 문제가합니다 (object_id 방법은 실제로 id를 불렀다, 철도의 id 방법에 의해 무시되었다)는 nil의 OBJECT_ID는 사실에 의해 발생되면서 4. 그래서 당신은 모델 인스턴스가 될 것으로 예상되는 변수에 id를 호출 할 것이지만, 실제로는 nil이므로 데이터베이스에서 레코드의 id를 얻을 때 "4"가 반환됩니다.

+0

"Ruby에서 모든 것 (그리고 모든 것을 의미)은 하나의 대상입니다." 아니, 전부는 아니야. 'end' 키워드는 예를 들어 객체가 아닙니다. 그러나 모든 것이 평가된다는 것은 당연한 것입니다. –

+0

거기 있어요. :) –

+0

@JohnFeminella * 모든 것이 개체를 평가하는 것이 더 나은 방법 일 수 있습니다. 'end' 자체는 객체가 아니지만 결과로 생성되는 것이 무엇이든간에 객체로 보장됩니다. – tadman

3

레일스에서 ​​ActiveRecord 모델 인스턴스는 데이터베이스의 id 열에 저장된 값에 매핑되는 id 속성을가집니다. 레코드가 저장되지 않은 경우 nil 일 수 있습니다.

Ruby에서 object_id은 해당 개체의 ID를 나타내는 값입니다. 항상은 루비의 모든 것이 객체이기 때문에 무언가로 채워집니다.

이 두 가지는 관련이 없습니다. 모델의 독립 인스턴스가 여러 개있을 수 있습니다. 각 인스턴스는 고유 한 object_id 값을 가지지 만 동일하게는 id입니다.

두 변수가 동일한 object_id을 가진 무언가를 참조하면 정확히 동일한 객체를 참조합니다.

object_id이 코드에 사용되는 경우는 드뭅니다. 거의 필요하지 않은 루비 내부입니다. 주로 동일 물체에 대해 이야기하고 있는지 확인하는 것이거나 등가물 인 것입니다.

한편, id 및 이와 유사한 값은 관계형 데이터베이스를 함께 묶는 접착제이므로 자주 사용됩니다. 한마디로

+0

'id'와'object_id'는'기본 '과'외래 키'일 수 있습니까? – Pavan

+0

'object_id'는 데이터베이스와 전혀 관련이 없습니다. 그것은 하나의 루비 프로세스에만 국한되며 아무 것도 될 수 없으며 고유 한 난수 일 수 있습니다. 반면에'id'는 데이터베이스에 의해 정의되고 시간이 지남에 따라 일관성이있을 것으로 예상됩니다. 일반적으로'id'는 대개 기본 키 *이지만,'user.id'를 참조하는'user_id'와 같은 것이 다른 테이블에 있기 때문에 * 외래 키 *로 간주 될 수 있습니다. – tadman

+0

고마워요! – Pavan

관련 문제