我正在处理遗留数据库,因此配置必须胜过惯例..
如何告诉活动记录使用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
。
答案 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