"未知绑定列"访问has_many关联类时出错

时间:2014-06-21 06:11:49

标签: ruby-on-rails rails-activerecord

我写了一个相当简单的应用程序来列出我收集的一些测试数据。每个测试运行都有几个与之关联的配置实体。列出测试运行时,我没有麻烦,网站按预期执行。但是,当我创建一个模型来关联配置时,我遇到了一个无法解决的错误。

我的代码使用两个类:TestRun和TestConfiguration:

# test_run.rb
class TestRun < ActiveRecord::Base
    self.table_name = 'testrun'
    self.inheritance_column = "inheritance_type"

    has_many :testconfigurations, class_name: "TestConfiguration"   
end

#test_configuration.rb
class TestConfiguration < ActiveRecord::Base
    self.table_name = 'testconfiguration'
    self.inheritance_column = "inheritance_type"

    belongs_to :testrun
end

为DB中的现有表格创建模型。我已经从我的db / schema.rb中的数据库中转储了模式:

# snippets from schema.rb

  create_table "TestRun", force: true do |t|
    t.string   "label",            limit: 128
    t.string   "description",      limit: 256
    t.integer  "result_id",                    null: false
    t.string   "type",             limit: 32
    t.datetime "starttime"
    t.datetime "endtime"
    t.string   "name",             limit: 128
    t.integer  "owner_id"
    t.integer  "configuration_id",             null: false
    t.integer  "environment_id",               null: false
  end

  add_index "TestRun", ["configuration_id"], name: "IX_TestRun_configid"
  add_index "TestRun", ["result_id"], name: "IX_TestRun_resultid"
  add_index "TestRun", ["type"], name: "IX_TestRun_type"

  create_table "TestConfiguration", force: true do |t|
    t.string   "build",      limit: 128
    t.string   "branch",     limit: 24
    t.string   "label",      limit: 256
    t.datetime "date"
    t.string   "type",       limit: 64,  null: false
    t.integer  "testrun_id",             null: false
  end

  add_index "TestConfiguration", ["branch"], name: "IX_TestConfiguration_branch"
  add_index "TestConfiguration", ["build"], name: "IX_TestConfiguration_build"
  add_index "TestConfiguration", ["testrun_id"], name: "IX_TestConfiguration_testrunid"
  add_index "TestConfiguration", ["type"], name: "IX_TestConfiguration_type"

我已经编写了一个非常基本的TestRun列表,它运行得很好(确认连接到我的数据库的rails和架构适用于TestRun和另一个类,并且所有基本管道都适用于简单列表)。这是控制器:

class TestrunController < ApplicationController
  def index
      @testruns = TestRun.last(100).reverse
  end
end

最后,我为此写了一个观点,这就是麻烦发生的地方。以下是发生错误的视图中的相关代码段:

    <% @testruns.each do |run| %>
        <tr class="data_row">
          <td><%= run.id %></td>
          <td><%= run.type %></td>

          <td>
            <% run.testconfigurations.each do |config| %>
                <%= config.branch %><br>
            <% end %>
          </td>

该页面一直有效,直到我添加了与迭代测试配置相关的3行。现在,使用这些行barfs,出现如下错误:

未知的绑定列。我们可以解释这一点。

以下行是错误中突出显示的问题:

<% run.testconfigurations.each do |config| %>

我已经玩过模型,架构,并在视图上尝试了很多技巧,但我的轨道知识太年轻,无法克服这个错误。关于为什么列无法绑定的任何见解?

1 个答案:

答案 0 :(得分:0)

这有没有得到解决?我遇到了同样的问题。

class Field < ActiveRecord::Base
  self.primary_key = 'FieldID'
  belongs_to :layout, foreign_key: :layoutid
end
class Layout < ActiveRecord::Base
  self.primary_key = 'LayoutID'
  has_many :fields, foreign_key: :layoutid
end

当我编码“放置Layout.joins(:fields).where('[dbo]。[Layouts] .layoutid = 3035')。to_sql”时,我得到以下内容,我猜是好的:

SELECT [dbo].[Layouts].*
FROM [dbo].[Layouts]
INNER JOIN [dbo].[Fields] ON [dbo].[Fields].[layoutid] = [dbo].[Layouts].[layoutid]
WHERE ([dbo].[Layouts].layoutid = 3035)

我尝试这样做时出错。

l = Layout.find(3035)       # << Unknown bind columns.
l.fields.each {|f| puts f}  

这是activerecord 4.1.6和activerecord-sqlserver-adapter 4.1.0。

FollowUp - 我的问题已解决

class Layout < ActiveRecord::Base
  self.table_name = 'dbo.Layouts'
  self.primary_key = 'LayoutID'
  belongs_to :feed, foreign_key: 'FeedID'
  has_many :fields, foreign_key: 'LayoutID'
end
class Field < ActiveRecord::Base
  self.table_name = 'dbo.Fields'
  self.primary_key = 'FieldID'
  belongs_to :layout, foreign_key: 'LayoutID'
end

我必须确保外键中的案例是正确的。 :layoutid和'layoutid'没有用。但'LayoutID'确实有效,它与sqlserver列定义中的情况相匹配。这将是文档中的一个很好的说明。