我正在重写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
我该如何纠正?
答案 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
可能会解决您的问题。