2013-10-13 2 views
1

있을 때 효율적으로 first_or_initialize 사용 방법 : 그 이유는 레코드가 이미 존재하는 대부분의 시간을 기록은 일반적으로 이미 나는 다음과 같은 psuedocode 실행하기 위해 액티브를 사용하는 방법을 알아 내려고 노력하고있어

rows_updated = UPDATE my_table SET my_column="abc" WHERE id=123 
if rows_updated == 0 then INSERT INTO my_table (id, my_column) VALUES (123, "abc") 

입니다

을 . first_or_create!이 생성되는 것으로 보이는 여분의 SELECT 쿼리를 저장하고 싶습니다.

아이디어가 있으십니까?

답변

2

또한 옵션 하나는 명령 대신이 모든 코드를 대체 사용이 경우에 (내 관점에서) 다른 더 우아한 해결책이있다.

REPLACE INTO my_table (id, my_column) VALUES (123, "abc") 

이 솔루션은 대부분의 경우 잘 작동하지만이 코드 파이스 동전에 매우 높은 부하가 있다면, 당신은 내가 해요 사용 INSERT .... ON DUPLICATE KEY UPDATE

+0

Thx! 전에이 명령을 보지 못했습니다. 유망 해 보인다. –

0

먼저 id가 없으면 객체를 생성 할 수 있도록 찾기 또는 초기화하십시오. 그런 다음 새로운 것인지 확인하십시오. 새로운 내용을 저장하면 업데이트하십시오.

obj= find_or_initialize_by_id(obj) 
obj.new_record? ? prod.save! : *update the entry* 
0

을 고려해야합니다

은 실행 모두 고효율 데이터베이스 솔루션과 모두를위한 것이지만 첫 번째 쿼리는 1 ~ 2 밀리 초 정도의 데이터를 가져와야합니다. 데이터베이스보다 물리적으로 읽기가 필요할 수 있으므로 업데이트보다 덜 비효율적 인 것처럼 보입니다. 그것에 접근하십시오 - 그 업데이트는 그 pre-caching으로부터 이익을 얻습니다.

따라서이 작업이 성능상으로 중요한 성능 문제가 아니라면이 작업을 최적화하지 않으려 고합니다.

관련 문제