2011-01-18 128 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

相关问题