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