2014-10-07 31 views
0

查看类似于GitHub或GitLab问题的模型。有三个实体:引用ActiveRecord中的两个级别的祖先

Project --- Milestones --- Issues 

但是,由于问题可能还没有关联的里程碑,因此问题也会引用项目实体。代码:

class Project < ActiveRecord::Base 
    has_many :issues 
    has_many :milestones 

end 

class Milestone < ActiveRecord::Base 
    belongs_to :project 
    has_many :issues 

end 

class Issue < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :milestone 

end 

有没有办法告诉Rails,在任何给定的问题下,必须保持self.milestone.project == self.project

另外,有没有一种方法可以正确地进行以下工作? project.milestones.first.issues.new()并有新创建的问题有project引用正确填充?

回答

0

我不会将项目关联添加到问题模型。相反,请将has_many :issues, :through => :milestones关联添加到Project模型。在Issue模型上添加delegates指令,以便您可以直接从问题访问项目。

class Project < ActiveRecord::Base 
    has_many :milestones 
    has_many :issues, :through => :milestones 
end 

class Milestone < ActiveRecord::Base 
    belongs_to :project 
    has_many :issues 
end 

class Issue < ActiveRecord::Base 
    belongs_to :milestone 
    delegates :project, :to => :milestone 
end 

给定的产品,找到它的所有问题:

project = Project.find(1) 
project.issues 

给定一个里程碑,找到它的所有问题:

milestone = Milestone.find(1) 
milestone.issues 

考虑的问题,得到它的项目:

issue = Issue.find(1) 
issue.project 
+0

理论上听起来不错,但你_can_c解决与某个项目相关的问题,并且稍后才会确定其里程碑。 – pgb 2014-10-07 19:08:27