如何配置活动记录以使用某个列来获取ID?

时间:2014-11-08 18:34:55

标签: ruby-on-rails ruby-on-rails-3 activerecord

我正在处理遗留数据库,因此配置必须胜过惯例..

如何告诉活动记录使用signature获取有关signatures表格的信息?

这是我的活动模型:

class Event < ActiveRecord::Base
  # DB Schema
  # sid | cid | signature | timestamp
  #----------------------------------

  attr_accessible :sid, :cid, :signature, :timestamp
  self.primary_keys = :sid, :cid
  self.table_name = 'event'
  has_many :sensors, :foreign_key => :sid
  has_many :signatures, :foreign_key => :sig_id
end

这是我的签名模型:

class Signature < ActiveRecord::Base
  # DB Schema
  # sig_id | sig_name | sig_class_id | sig_priority | sig_rev | sig_sid | sig_gid

  attr_accessible :sig_id, :sig_name, :sig_class_id, :sig_priority, :sig_rev, :sig_sid, :sig_gid
  self.table_name = 'signature'
  self.primary_key = :sig_id
  belongs_to :event, :foreign_key => :sig_id
  belongs_to :sig_class
  has_many :references, :through => :sig_references
  has_many :sig_references, :foreign_key => :sig_id
end

例如。查看一个事件时,sid为4,signature为493。

[196] pry(main)> last_event
=> #<Event sid: 4, cid: 49, signature: 493, timestamp: "2014-06-25 20:22:57">

如果我查看传感器,它会使用正确的ID sid

[197] pry(main)> last_event.sensors
=> [#<Sensor sid: 4, hostname: "VS-101-Z1:dna2:dna3", interface: "dna2:dna3", filter: nil, detail: 1, encoding: 0, last_cid: 51>]

当我查看签名时,它使用相同的ID sid,而不是signature

[198] pry(main)> last_event.signatures
=> [#<Signature sig_id: 4, sig_name: "FILE-JAVA Oracle Java Rhino script engine remote co...", sig_class_id: 3, sig_priority: 1, sig_rev: 6, sig_sid: 23008, sig_gid: 1>]

更新:

我搞定了,我把我的事件模型改为:

class Event < ActiveRecord::Base
  # DB Schema
  # sid | cid | signature | timestamp
  #----------------------------------

  attr_accessible :sid, :cid, :signature, :timestamp
  self.primary_keys = :sid, :cid
  self.table_name = 'event'

  has_many :sensors,
           :foreign_key => :sid

  has_many :signatures,
           :foreign_key => :sig_id,
           :primary_key => :signature
end

基本上只是将:primary_key => :signature添加到has_many

1 个答案:

答案 0 :(得分:0)

查看签名模型,包括以下代码行:

self.primary_key = :sig_id
belongs_to :event, :foreign_key => :sig_id

第一个表示表signature的关键字是字段:sig_id

第二行表示此签名记录属于事件记录,其密钥存储在当前签名记录的字段:sig_id中。

我猜其中一个字段是错误的,因为它不能总是与Event的键和Signature的键相同的值。

修改:更新后,我发现您的事件模型有一个名为signature的字段,其值为signature。然后我可以说一个事件记录,只允许一个签名(其密钥存储在字段signature中)。同时,一个签名记录可以与许多事件记录相关。

然后,您的关联必须是:活动belongs_to :signature和签名has_many :events

我猜你正在使用composite-primary-key gem。他们的模型可能会这样:

class Event < ActiveRecord::Base
  ...
  self.primary_keys = :sid, :cid
  ...
  belongs_to :signatures, :foreign_key => :signature
end

class Signature < ActiveRecord::Base
  ...
  has_many :events, :foreing_key => :signature, :primary_key => :sig_id
  ...
end