2011-05-20 50 views
0

在我的应用程序相关联的最佳/最有效的方式,我有以下情况:轨道 - 什么是这些模型

用户belongs_to的集团 集团的has_many用户

项目belongs_to的用户 用户的has_many项目

以下情况也是如此: - 每个组将有一个BaseCase - 每个项目将有多个方案和一个BaseCase(取决于项目用户所属的组) - Scen ARIO和BaseCase是同一类型的对象(我们称之为数据) 的 - 每个场景的默认值是该组的BaseCase值,但用户可以更改这些默认值来创建特定的场景

我不知道如何有效地通过关联捕捉所有这些关系,有没有人有任何想法?感谢

回答

0

如果我理解正确的话,那么这样的事情

class User 
    belongs_to :group 
    has_many :projects 
end 

class Group 
    has_many :users 
    has_many :projects, :through => :users 
    has_one :base_case 
end 

class Project 
    has_many :scenarios 
    has_one :base_case 
    belongs_to :user 
    has_one :group, :through => user 
    has_one :base_case, :through => :group 
end 

class Scenario 
    belongs_to :project 
    has_one :base_case, :through => :project 

    before_create do 
    self.attributes = self.base_case.attributes.except(:group_id, ...) 
    end 
end 

class BaseCase 
    belongs_to :group 
end 
+0

这是非常有用的感谢,请问self.attributes设置的默认值的情况下?如果没有包含':through =>:xxx'的行,这也可以工作吗?谢谢 – Zakoff 2011-05-21 13:04:08

+0

1.是的,self.attributes = self.base_case.attributes.except(:group_id,...)从base_case设置默认值 2.不需要,:through =>:xxx是必需的。它是这样生成SQL查询:'select * from场景s内部连接项目p上p.id = s.project_id内部连接组...内部连接base_cases b上b.group_id = g.id' – Anton 2011-05-21 17:38:40

+0

感谢您采取有时间回答,不幸的是我没有代表你的投票权,但我已经接受了答案 – Zakoff 2011-05-21 18:04:12