좋아, 정말 이상한 문제입니다.레일은 옵션 해시를 문자열로 변환합니다.
def enterprise_mti_up(*args)
enterprise_mti args.extract_options!, direction: :up
end
def enterprise_mti_down(*args)
enterprise_mti args.extract_options!, direction: :down
end
: 여기
class TestEnterprise < ActiveRecord::Migration
def up
enterprise_mti_up superclass_table: 'test_superclasses', subclass_tables: ['test_subclass_ones', 'test_subclass_twos']
end
def down
enterprise_mti_down superclass_table: 'test_superclasses', subclass_tables: ['test_subclass_ones', 'test_subclass_twos']
end
end
라이브러리 코드의 샘플입니다 : 내 레일 마이그레이션이 같은 코드를 작성할 수 있도록 내가 액티브 :: 마이그레이션을 확장하는 라이브러리를 작성하려고 해요
== TestEnterprise: migrating =================================================
-- enterprise_mti_up({:superclass_table=>"test_superclasses", :subclass_tables=>["test_subclass_ones", "test_subclass_twos"]})
-> 0.0005s
== TestEnterprise: migrated (0.0007s) ========================================
그러나 사실 레일에 일부 있기 때문에 데이터베이스가 변경되지 : 나는 어느 방향으로 마이그레이션을 실행하면 모든 가 작동 나타납니다 enterprise_mti_up 및 enterprise_mti_down에서 옵션 해시를 문자열로 변환하는 방법! 내가 해시를 조작하는 기능 중 하나를 변경하면, 다음과 같은 결과를 얻을 :
def enterprise_mti_down(*args)
opts = args.extract_options!
puts "opts: #{opts}"
puts "opts[:superclass_table]: #{opts[:superclass_table]}"
puts "args: #{args}"
puts "args.last.class: #{args.last.class}"
enterprise_mti args.extract_options!, direction: :down
end
...
== TestEnterprise: reverting =================================================
-- enterprise_mti_down({:superclass_table=>"test_superclasses", :subclass_tables=>["test_subclass_ones", "test_subclass_twos"]})
opts: {}
opts[:superclass_table]:
args: ["{:superclass_table=>\"test_superclasses\", :subclass_tables=>[\"test_subclass_ones\", \"test_subclass_twos\"]}"]
args.last.class: String
-> 0.0002s
== TestEnterprise: reverted (0.0005s) ========================================
사람이 해시 문자열로 변환하는 이유 어떤 생각을 가지고 있습니까 어떻게 내가 내 방법에 해시를 전달할 수 있습니다? 감사!
참고 : 내 테스트에서 옵션 해시 앞에 첫 번째 인수로 문자열을 전달하면 모든 것이 정상적으로 작동한다는 것을 알았습니다. 그러나 해시 이전에는 아무런 논쟁 거리가 없어야합니다. 이로 인해 Rails는 마이그레이션 메소드의 첫 번째 인수로 문자열/심볼을 기대하기가 어렵다고 생각하게됩니다.
수정 된 버전의'enterprise_mti_down'은'extract_options! '를 두 번 호출했기 때문에 깨졌습니다.'extract_options!'는'Array # pop'을 둘러싸고있는 매우 얇은 래퍼입니다. 즉, 나는 너와 똑같은 행동을하는 것이 아니다. –
args.extract_options를 바꾸십시오! args.first에 의해 – carlosavoy
좋은 캐치, @muistooshort. – earksiinni