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 应用程序。运行单元测试时出现以下错误。

    NoMethodError:未定义的方法“find_by_configuration_name”用于#
      org/jruby/RubyBasicObject.java:1687 处的方法缺失
      /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”行中出错。



      public void testRubyDatabaseQuery() {
        String theValue = "test";
        String jrubyCode =
        "require 'connection_master' \n"
        + "require 'configuration' \n"
        + "cm = ConnectionMaster.new \n"
        + "cm.set_connection \n"
        + "puts 'black cow of revenge' \n"
        + "config = Configuration.find(:all,:conditions => ['configuration_name=?','test']) \n"
        + "config = Configuration.find_by_configuration_name('test') \n"
        + "puts 'red cow of revenge' \n"
        + "cm.clear_connections \n"
        + "config.configuration_text \n";
        String executeValue = (String)JRubyMaster.execute(jrubyCode);
        this.assertEquals("executeValue and theValue do not match.", theValue, executeValue);
      }

4

1 回答 1

0

在构建问题时,我找到了自己的答案:) 我觉得继续发布问题和答案很有趣。

在我的第一次尝试中,我使用了activerecord-jdbc-adapter,问题是我使用的是“Configuration.find_by_configuration_name”,而它正在构建的是“Configuration.find_by_CONFIGURATION_NAME”,与“config.configuration_text”相同。数据库中大写的列名和 activerecord-jdbc-adapter 创建了大写的方法。一旦进行了更改,由于使用“LIMIT”,它开始抛出无效的 sql 错误。

然后我切换到使用activerecord-jdbcsqlanywhere-adapter,它与“Configuration.find_by_configuration_name”和“config.configuration_text”一起工作,但单元测试失败了。这是因为它构建了“returnValue[0]['arbitrary']”而不是“returnValue[0]['ARBITRARY']”,尽管我的查询是“SELECT 'ARBITRARY' AS ARBITRARY”。activerecord-jdbcsqlanywhere-adapter 强制所有内容为小写。

于 2012-05-03T13:51:58.137 回答