2012-05-02 4 views
0

JRuby 1.6.7, ActiveRecord 3.2.3, activerecord-jdbc-adapter 1.2.2, activerecord-jdbcsqlanywhere-adapter-1.1.1을 사용하고 있습니다. 현재 Sybase JDBC4 드라이버가 있습니다. 현재 Ruby On Rails 애플리케이션 전체를 사용하는 것은 옵션이 아닙니다. 유닛 테스트를 실행할 때 다음과 같은 오류가 발생합니다.JRuby ActiveRecord/ActiveModel이 테이블 열의 메소드와 속성을 만들지 않습니다. (정의되지 않은 메소드)

 

    NoMethodError: undefined method `find_by_configuration_name' for # 
     method_missing at org/jruby/RubyBasicObject.java:1687 
     method_missing at /home/lynchcs/.rvm/gems/jruby-1.6.5.1/gems/activerecord-3.2.3/lib/active_record/dynamic_matchers.rb:27 

테이블을 올바르게 식별하는 단위 테스트에서 스키마 덤프를 수행 할 수 있습니다. 다음은 테이블 스키마입니다.



     create_table "THE_CONFIGURATION", :primary_key => "CONFIGURATION_ID", :force => true do |t| 
     t.string "CONFIGURATION_GROUP", :limit => 32 
     t.string "CONFIGURATION_TYPE", :limit => 32 
     t.string "CONFIGURATION_NAME", :limit => 32 
     t.string "CONFIGURATION_TEXT", :limit => 7168 
     end 

다음은 내가 작성한 모델입니다.



    require 'rubygems' 
    require 'active_record' 

    class Configuration < ActiveRecord::Base 
     self.table_name = 'SOART_CONFIGURATION' 
     self.primary_key = 'configuration_id' 
    end 

내 연결을 관리하는 데 사용한 클래스는 다음과 같습니다. 이 클래스는 데이터베이스에 성공적으로 연결하고 쿼리를 실행합니다.



    require 'java' 
    require 'rubygems' 
    require 'active_record' 

    class ConnectionMaster 
     def test_object 
     "ARBITRARY" 
     end 

     def set_connection 
     ActiveRecord::Base.establish_connection(
     :adapter => 'jdbc' , 
     :driver => 'com.sybase.jdbc4.jdbc.SybDriver' , 
     :url => 'jdbc:sybase:Tds:192.168.137.137:1111/MYAPP' , 
     :username => 'noneya' , 
     :password => 'noneya' 
     ) 
     ActiveRecord::Base.connection.execute("SELECT 'ARBITRARY' AS ARBITRARY") 
     end 

     def clear_connections 
     ActiveRecord::Base.clear_active_connections! 
     end 

    end 

"config = Configuration.find_by_configuration_name ('test')"이 실행되면 오류가 발생합니다. 이 행을 주석 처리하면 "config.configuration_text"행에서 오류가 발생합니다.

답변

0

질문을 만들면서 나는 내 자신의 대답을 찾았습니다. 나는 질문과 대답을 모두 게시하는 것이 흥미로울 것이라고 느꼈습니다.

첫 번째 시도에서 activerecord-jdbc-adapter를 사용했고 문제는 "Configuration.find_by_configuration_name"을 사용하고 "config.configuration_text"와 동일한 "Configuration.find_by_CONFIGURATION_NAME"이었습니다. 데이터베이스 및 activerecord-jdbc-adapter에서 대문자로 된 열 이름은 대문자가있는 메소드를 작성했습니다. 일단 변경이 이루어지면 "LIMIT"를 사용하기 때문에 SQL 오류가 발생하고 유효하지 않게됩니다.

그런 다음 activerecord-jdbcsqlanywhere-adapter를 사용하여 전환했으며 "Configuration.find_by_configuration_name"및 "config.configuration_text"로 작동했지만 유닛 테스트가 실패했습니다. 이는 내 쿼리가 "SELECT 'ARBITRARY'ARBITRARY"임에도 불구하고 "returnValue [0] [ 'ARBITRARY']"가 아닌 returnValue [0] [ 'arbitrary'] "를 작성했기 때문입니다. activerecord-jdbcsqlanywhere-adapter는 모든 것이 소문자가되도록합니다.

+0

답을 사용자의 대답으로 표시합니다 (녹색 확인 표시) –