2011-01-18 125 views
2

我有一個Project模型和一個Contact模型。項目模型有一個所有者和一個客戶,兩者都是Contact s。我顯然遇到了一些模棱兩可的事情,因爲如果我有聯繫人並要求其項目,Rails將不知道我是否在要求它是客戶的項目還是項目的所有者。到目前爲止,我有這樣的:如何在兩個模型之間做兩個has_many/belongs_to關係?

class Contact < ActiveRecord::Base 
    has_many :projects 
end 

class Project < ActiveRecord::Base 
    belongs_to :owner, :class_name => 'Contact', :foreign_key => 'owner_id' 
    belongs_to :client, :class_name => 'Contact', :foreign_key => 'client_id' 
end 

我該如何在這裏建立兩個關係?

回答

7

其類似的方式belongs_to是在另一個類中定義的。

所以基本上協會

class Contact < ActiveRecord::Base 
    has_many :projects_owned, :class_name => "Project", :foreign_key => "owner_id" 
    has_many :projects_as_client, :class_name => "Project", :foreign_key => "client_id" 
end 

名稱可能會更好。在我之前描述的單表繼承方法也是一個很好的方法,但是如果對於每個OwnerContact和ClientContact類有很多不同的行爲,那就去做,否則它可能只是一個無用的開銷。

+0

這正是我需要的,謝謝Rishav! – Skilldrick 2011-01-18 22:38:30

1

您應該嘗試在聯繫人表上使用單個表繼承。所有你需要做的工作就是實現一個'type'列(字符串)。軌道將處理其餘的

class Contact < ActiveRecord::Base 
    # implement a type column 
    has_many :projects 
end 

class OwnerContact < Contact 
end 

class ClientContact < Contact 
end 

class Project < ActiveRecord::Base 
    belongs_to :owner, :class_name => 'OwnerContact' 
    belongs_to :client, :class_name => 'ClientContact' 
end 
+0

問題是某些聯繫人可能是所有者*和*客戶端。我認爲這可能更多地指向建模問題,儘管... – Skilldrick 2011-01-18 22:29:56

2

我覺得這裏的應該是多態關聯,這樣的事情

class Owner < ActiveRecord::Base 
    has_many :projects, :as => :person 
end 

class Client < ActiveRecord::Base 
    has_many :projects, :as => :person 
end 

class Project < ActiveRecord::Base 
    belongs_to :person, :polymorphic => true 
end 

現在,您可以通過@client.projects@owner.projects檢索項目。如果您想從@project獲得人員,您應該添加到項目遷移中:

class CreateProjects < ActiveRecord::Migration 
    def self.up 
    create_table :projects do |t| 
     t.references :person, :polymorphic => true 
     t.timestamps 
    end 
    end 
    ... 
+0

與tusharr的建議一樣,問題在於,所有者和客戶可能是同一個人 - 我不想要兩個單獨的記錄。 – Skilldrick 2011-01-19 09:13:19

相關問題