我试图在我无法控制的数据库中建立两个视图之间的关联。这是人与工作之间的关系,每个人都有很多工作,每个工作属于一个人。这是人员表:
class Person < ActiveRecord::Base
self.table_name = 'PER_VW'
self.primary_key = 'EMPLID'
has_many :jobs, foreign_key: 'EMPLID'
end
和工作表:
class Job < ActiveRecord::Base
self.table_name = 'JOB_VW'
belongs_to :person, foreign_key: 'EMPLID'
end
从控制台我可以运行Person.where(emplid: '0037485').jobs
并且我没有收到错误,但我也没有得到任何结果。如果我改为:
p = Person.where(emplid: '0037485').first()
Job.where(emplid: p.emplid)
我得到了我期望的结果。这是一个oracle数据库,我使用以下gems来连接:
gem 'ruby-oci8', '~> 2.1.7'
gem "activerecord-oracle_enhanced-adapter", "~> 1.5.0"
编辑:根据Lurker的建议,我将foreign_key: 'EMPLID'
添加到两个表中,但仍然没有结果。这是我在控制台中看到的这个SQL:
irb(main):004:0> p.jobs
Job Load (36.5ms) SELECT "JOB_VW".* FROM "JOB_VW"
WHERE "JOB_VW"."EMPLID" = :a1 [[nil, nil]]
=> #<ActiveRecord::Associations::CollectionProxy []>
我认为[nil, nil]
数组与它有关。但我不确定为什么它会是空的。
答案 0 :(得分:0)
如果关联中有外键,则需要在其他模型中指定:
class Job < ActiveRecord::Base
self.table_name = 'JOB_VW'
belongs_to :person, foreign_key: 'EMPLID'
end
否则,它将采用person_id
。
在简单的情况下,根据您的应用对模型的处理方式,您可以省略foreign_key
模型中has_many
的{{1}}。无论如何,我通常都会将它包含在两个模型中。
编辑:执行查询时,关联对实例进行操作,而不是对集合进行操作。因此,而不是Person
尝试获取由一个人组成的ActiveRecord关系的Person.where(emplid: '0037485').jobs
,而是以这种方式尝试,这将获得集合中的第一个人,然后获得作业:
jobs
或者,这可能有效,因为员工ID是主键:
Person.where(emplid: '0037485').first.jobs