1
execute <<-SQL 
    commit 
    reindex database ActiveRecord::Base.configurations[Rails.env]['database'] 
SQL 

분명히 작동하지 않지만 아이디어를 얻을 수 있습니다. 나는 위의 코드 구조가 심지어 그것을 찾기 위해 호출되었는지 알지 못한다.Rails 마이그레이션에서 트랜잭션 비활성화 : 다음 블록과 같은 블록에 루비 변수를 포함하려면 어떻게합니까?

포스트 그레스는 트랜잭션 내부의 DB를 재 인덱싱을 허용하지 않는, 그래서 나는 레일까지 거래를 해제하는 방법이있을 나타나지 않기 때문에 위의 해킹이 작동합니다 바라고 있어요 4

UPDATE 

그래서 위의 작동하지 않았다, 그러나이 해킹했다 :

# force a reindex after we switched all those columns to citext 
execute "commit;" 
execute "reindex database #{ActiveRecord::Base.configurations[Rails.env]['database']} force;" 

답변

1

<<-SQL ... SQL 부분은 execute 함수의 인수입니다 여러 줄 문자열을 만듭니다. 보통 "value #{myObject.value}" 문자열과 같이 해당 문자열에 루비 표현을 포함 할 수 있습니다. 그러면 다음과 같이됩니다.

execute <<-SQL 
    commit 
    reindex database #{ActiveRecord::Base.configurations[Rails.env]['database']} 
SQL 

SQL 해킹이 작동하는지 여부는 알 수 없습니다. 그러나 실행중인 트랜잭션을 닫는 것처럼 보입니다.이 트랜잭션은 나중에 트랜잭션을 시작한 코드에 의해 다시 닫힙니다. 게다가 그 거래에 대한 이유가있을 수 있습니다. 즉, 레일스가 나중에 트랜잭션을 롤백하려고하면 이미 트랜잭션을 커밋 한 것처럼 실패하거나 적어도 작동하지 않을 것입니다.

+0

고맙습니다. Philipp. 확실히 해킹입니다. Rails 4가 안타 때까지 고비를 극복하려고합니다. 그들은''disable_ddl_transaction!''이라고 부르는 호출을 사용하여 위에서 수행하려고하는 것을 수행 할 수 있습니다. – AKWF