Ошибка «Неизвестные столбцы привязки» при доступе к классу, связанному с has_many

#ruby-on-rails #rails-activerecord

#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 / 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 строки, относящиеся к повторению тестовых настроек. Теперь с этими строками он выдает ошибку, подобную этой:

Неизвестные столбцы привязки. Мы можем это объяснить.

Следующая строка является выделенной проблемой в ошибке:

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

Я поиграл с моделями, схемой и попробовал много трюков с представлением, но мои знания rails слишком молоды и бессильны, чтобы справиться с этой ошибкой. Есть идеи относительно того, почему столбцы не могут связываться?

Комментарии:

1. Можно было бы использовать просто @testruns = TestRun.last(100)

2. Да, true, вероятно, сэкономит несколько байтов. Спасибо.

3. Я думал, что вы его отменяете @testruns.reverse.each . Хорошо, если в этом нужен другой код.

4. Внесены изменения в соответствии с комментариями. Тем не менее … к делу.

Ответ №1:

Это когда-нибудь решалось? У меня такая же проблема.

 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(:поля).где(‘[dbo].[Макеты].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.

Продолжение — моя проблема решена

 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. Это было бы неплохо отметить в документах.