어쩌면 일부 루비 전문가가 save()를 호출 할 때 activerecord가 삽입 또는 업데이트를 수행하는 방법에 대해 알 수 있습니다. 그것 뒤에있는 논리는 무엇입니까? 기본 키가 비어 있는지 확인하고, 업데이트가 아닌 경우 삽입을 수행합니까?activerecord는 삽입 또는 업데이트를 어떻게 수행합니까?
답변
나는 오히려 더 걸어 관통하지만 - 여전히-entirely- 쓸모-때 레일-3-제공 아웃 - 및 - 변경 - 모든 응답 : 레일에서 작동하는 방법
2.3 (일명 "오늘")
save
가 012,349를 호출
def create_or_update
raise ReadOnlyRecord if readonly?
result = new_record? ? create : update
result != false
end
레코드가 읽기 전용 인 경우에만 오류가 발생합니다으로 당신은이 방법의 첫 번째 줄을 무시할 수 있습니다 (이것은 보통 아니지만, 경우의가있을 수 있습니다 조인) : 다음과 같습니다. 여기서 우리가 관심을 갖는 것은 메서드 내부의 두 번째 및 세 번째 행입니다.
두 번째 줄은 같이 정의된다 new_record?
를 호출하십시오 initialize
때
# Returns true if this object hasn't been saved yet -- that is, a record for the object doesn't exist yet; otherwise, returns false.
def new_record?
@new_record || false
end
그리고 변수 @new_record
가 설정됩니다 (new
전화 initialize
, 그리고 우리에게 새로운 객체를 제공, 여기에 몇 가지 배경 루비-FU) 메서드가 호출됩니다. 이 @new_record
경우
true
이
create
전화 할게 그것이 거짓이라면 당신이 계신 우리에게 가져다
update
전화 할게, 내가 생각합니다.
또한 레코드를 찾으면 initialize
을 호출하지 않으므로 @new_record
을 설정하지 않습니다. 눈치 챘을 경우 new_record?
뒤에있는 코드는 @new_record || false
이며 @new_record
이 설정되지 않은 경우 false를 반환합니다.
예를 들어 Forum
레코드를 찾고 싶다고 가정하면 Forum.last
입니다.
- 이 액티브에서 상속
Forum
클래스 :: 자료 last
callsfind
클래스 메소드에last
메소드를 호출합니다.find
callsfind_last
find_last
callsfind_initial
find_initial
callsfind_every
callsfind_by_sql
find_every
및find_by_sql
전화instantiate
이 변경 사항을 따라 아무데도 @new_record
이 설정되어 있으므로 find
에 의해 얻은 기록은 새 기록이 아닙니다.
희망 사항을 이해하는 데 도움이됩니다.
아주 좋은 대답과 나는 당신이 그것을 쓸 시간이 당신을 생각합니다. 또한 @nw_record를 false로 설정하는 것에 관심이 있습니까? 그것이 데이터베이스에서 레코드를 가져 오는 경우 찾기를 수행하면됩니까? – rip747
메소드 찾기 체인으로 게시물을 업데이트했습니다. –
어쨌든 "new_record"속성을 직접 수정 하시겠습니까? –
원칙적으로 new_record? 방법을 사용합니다.
이 메서드는 새 레코드이면 true를 반환하고 그렇지 않으면 false를 반환합니다.
사실 실제로 어렵지 않습니다.
- 기존 레코드를 가져 오면 새로운 레코드가 아닙니다. 따라서
new_record?
은 direcly false를 반환 할 수 있습니다. - 새 레코드 (
Model.new
)를 만들 때new_record?
이 true를 반환합니다. 새로운 기록입니다. - 새 레코드를 저장하면 더 이상 새 레코드가 아닙니다. 내부 변수
@new_record
이 업데이트됩니다.new_record?
은 더 이상 true를 반환하지 않습니다. 그것이 일어날 때
라인, ActiveRecord::Base로 이동하여 볼 수있는 2911
어떤 사람들이 말하는 "RTFM"하는 것이 괜찮 동안self.id ||= new_id
@new_record = false
id
end
그가 2.3을 사용하고있을 때 마스터에 연결 중입니다. –
그건 내 주장을 변경하지 않습니다. 하지만 어쨌든 링크를 업데이트했습니다. –
- 1. ActiveRecord는 트랜잭션 내부에서 대량으로 삽입/삭제를 수행합니까?
- 2. ASP.NET에서 SVN 업데이트를 어떻게 수행합니까?
- 3. 웹 앱은 설정을 깨지 않고 자동 업데이트를 어떻게 수행합니까?
- 4. 장고 삽입을 어떻게 수행합니까?
- 5. 유효성 검사시 ActiveRecord는 어떻게 구현합니까 :
- 6. Django 템플릿 코드에서 "또는"을 어떻게 수행합니까?
- 7. 테이블 삽입 또는 업데이트를 위해 저장 프로 시저의 데이터 사용
- 8. T-SQL에서 간단한 삽입 또는 업데이트를 작성하려면 어떻게합니까?
- 9. SQLAlchemy를 사용하여 대량 삽입 또는 업데이트를 효율적으로 수행하려면 어떻게해야합니까?
- 10. MSBUILD에서 작업을 어떻게 수행합니까?
- 11. MongoDB에서이 쿼리를 어떻게 수행합니까?
- 12. JQuery가로드되면 어떻게 콜백을 수행합니까?
- 13. Mongoose에서 어떻게 쿼리를 수행합니까?
- 14. 장고에서이 쿼리를 어떻게 수행합니까?
- 15. SQL에서이 작업을 어떻게 수행합니까?
- 16. 어떻게 Vertica에서 크로스 탭을 수행합니까?
- 17. Postgres의 AFTER 트리거가 삽입/업데이트를 차단합니까?
- 18. PostgreSQL : 열 업데이트를 허용하지 않습니다. 어떻게?
- 19. 어떻게 배열 내에서 GROUP BY 또는 DISTINCT를 수행합니까?
- 20. LINQ to EF를 사용하여 '선택 또는 삽입'작업을 어떻게 수행합니까?
- 21. TeamCity와의 지속적인 통합을 어떻게 수행합니까?
- 22. 이 SQL 쿼리를 어떻게 수행합니까?
- 23. Linq에서 어떻게 동적 선택을 수행합니까?
- 24. Django 템플릿에서이 루프를 어떻게 수행합니까?
- 25. 콘솔에서 C 프로그래밍을 어떻게 수행합니까?
- 26. 대량의 동시 핑은 어떻게 수행합니까?
- 27. NServiceBus와 어떻게 통합 테스트를 수행합니까?
- 28. SQLite의 증분 백업을 어떻게 수행합니까?
- 29. 다음 SQL 검색은 어떻게 수행합니까?
- 30. 이 SQL 쿼리는 어떻게 수행합니까?
우수 질문. –