如何在两个模型之间做两个has_many/belongs_to关系?
我有一个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
我该如何在这里建立两个关系?
其类似的方式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类有很多不同的行为,那就去做,否则它可能只是一个无用的开销。
您应该尝试在联系人表上使用单个表继承。所有你需要做的工作就是实现一个'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
问题是某些联系人可能是所有者*和*客户端。我认为这可能更多地指向建模问题,尽管... – Skilldrick 2011-01-18 22:29:56
我觉得这里的应该是多态关联,这样的事情
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
...
与tusharr的建议一样,问题在于,所有者和客户可能是同一个人 - 我不想要两个单独的记录。 – Skilldrick 2011-01-19 09:13:19
这正是我需要的,谢谢Rishav! – Skilldrick 2011-01-18 22:38:30