Rails在Trestle / Admin中连接表

时间:2017-11-14 14:14:45

标签: ruby-on-rails

我正在重写Rails 5.1中的旧PHP应用程序并迁移数据库。

我有两个数据表:

table: jobs
id   library
-------------
20   foo-20
200  bar-200

table: manuscripts
id    job_id  shelfmark
-----------------------
743   200     MS0403

我想要实现的是显示:

library    shelfmark 
---------------------
bar-200        MS0403

但是我得到了foo-20而不是bar-200 for library:

library    shelfmark
--------------------
foo-20     MS0403

外键job_id似乎被错误引用。

和模特:

class Job < ApplicationRecord
  has_one :manuscripts
end

class Manuscript < ApplicationRecord
  has_one :job
  belongs_to :job
end

在TrestleAdmin app / admin / manuscripts_admin.rb

Trestle.resource(:manuscripts) do

  table do
    column :library, ->(ob) { ob.job.library }
    column :shelfmark
  end
end

我该如何纠正?

1 个答案:

答案 0 :(得分:0)

简答

您应该在belongs_to表格上使用Manuscript关系并删除has_one关系:

class Manuscript < ApplicationRecord
  belongs_to :job
end

<强>解释

belongs_to关联告诉Rails在当前模型的表中查找外键。在您的情况下,belongs_to :job告诉Rails在job_id表中查找manuscripts。这是您正在使用的表模式,因此是正确的关联。

相反,has_one关联告诉Rails在关联(其他)表中查找外键。在这种情况下,has_one :job告诉Rails在manuscript_id表中查找jobs。根据您提供的架构,这不正确。

您可以在Ruby on Rails Associations Guide

中详细了解相关信息

<强>买者

根据您遇到的错误,您的数据库中可能还有损坏的数据。您需要修复任何损坏的数据才能使其正常工作。但是,删除has_one可能会解决您的问题。