2014-11-08 24 views
0

我處理遺留數據庫,所以配置將有王牌約定..如何配置活動記錄使用某個列來獲取ID?

如何判斷當前記錄使用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"> 

如果我看的傳感器,它使用了正確的標識,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>] 

UPDATE:

我得到它的工作,我改變了我的事件模型,以這樣的:

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

退房簽名模型,包括以下幾行代碼:

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

首先說,表signature的關鍵是場:sig_id

第二行表示此簽名記錄屬於事件記錄,其密鑰存儲在當前簽名記錄的字段:sig_id

我猜這些字段之一是錯誤的,因爲它不能總是相同的值的關鍵事件和簽名的關鍵。

編輯:更新後,我看到您的事件模型有一個名爲signature的字段,其值爲signature鍵。然後我可以說一個事件記錄只允許一個簽名(其密鑰存儲在字段signature)。同時,一個簽名記錄可能與許多事件記錄有關。

然後,您的關聯必須是:事件​​和A簽名has_many :events

我猜你正在使用composite-primary-key寶石。他們的模型可能是這樣的:

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 
+0

這使得總數。我改變了這一行'belongs_to:event,:foreign_key =>:signature',但它不起作用。也許還有一些我錯過了。 – 2014-11-08 21:52:58

+0

我認爲在事件模型這一行'自我。primary_keys =:sid,:cid'不正確,但我不確定。標準用法是'self.primary_key =:sid'單數和一個字段。 – 2014-11-08 22:00:10

+0

Ops,'belongs_to:event,:foreign_key =>:the_key'。 'the_key'必須是存儲事件密鑰的簽名表字段。 – 2014-11-08 22:02:40