Rails中远程数据库的关联

时间:2014-09-05 16:32:09

标签: ruby-on-rails ruby oracle ruby-on-rails-4 associations

我试图在我无法控制的数据库中建立两个视图之间的关联。这是人与工作之间的关系,每个人都有很多工作,每个工作属于一个人。这是人员表:

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]数组与它有关。但我不确定为什么它会是空的。

1 个答案:

答案 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