2009-07-29 46 views
1

我有兩個ActiveRecord的模型與的hasMany /屬於關聯關聯關係:使用ActiveRecord belongs_to的兩個鍵

class User < ActiveRecord::Base 
    has_many :letters 
end 

class Letter < ActiveRecord::Base 
    belongs_to :user 
end 

用戶模型具有REVISION_NUMBER屬性,我想範圍belongs_to的關聯,以致求信通過user.id和user.revision_number關聯到用戶。

我嘗試使用:條件密鑰記錄在API文檔:

class Letter < ActiveRecord::Base 
    belongs_to :user, :conditions => "revision_number = #{client_revision}" 
end 

但這種試圖呼籲書類,信不是實例客戶端版本。任何人都可以用正確的方向指向正確的方向來正確區分belongs_to關聯嗎?

我正在使用acts-as-revisable插件來版本化用戶模型。

回答

0

終於想通了,我需要的是像組合鍵,它的Rails的ActiveRecord不支持。該解決方案(至少目前)是信上寫自定義客戶端訪問器,支持組合鍵(ID和REVISION_NUMBER):

class Letter < ActiveRecord::Base 
    def client 
    Client.find_by_id(self.client_id).try(:find_revision, self.client_revision) 
    end 

    def client=(c) 
    self.client_id = c.id 
    self.client_revision = c.revision_number 
    end 
end 

class Client < ActiveRecord::Base 
    acts_as_revisable 

    has_many :letters 
end 

採用這種設置,客戶端#1.letters將檢索兩個數組信件,但信件#2.client將檢索客戶端#1R2,而信#2.client將檢索客戶端#1r4:

Client   id: 1 1 1 1 1 1 
     rev_number: 1 2 3 4 5 6 

Letter   id:   1    2 
     client_id:   1    1 
    client_revision:   2    5 

還是不確定這是否是這個問題的最好方法,但它似乎現在工作。

0

我很難理解你爲什麼想用這種方式來確定belongs_to的範圍。如果我錯了,請糾正我,但做這樣的事情可能會更好。我假設你需要某種版本控制系統:

class User < ActiveRecord::Base 
    has_many :letters 
end 

class Letter < ActiveRecord::Base 
    has_many :revisions, :class_name => "LetterVersion" 
    belongs_to :current, :class_name => "LetterVersion" 
end 

class LetterVersion < ActiveRecord::Base 
    belongs_to :letter 
end 
+0

如果需要,可以將當前範圍限定在最近更新的修訂版本中,並使用has_one。這將避免在字母模型中添加另一個外鍵。 – 2009-07-29 15:26:38

相關問題