2009-09-11 68 views
3

我有一个三列连接表。我已经尝试过定义三个模型,并且都有很多直通式和habtm。我正在使用活动脚手架,仅用于CRUD功能,那么它将被逐步淘汰。我有一种感觉,如果我想要一个三列连接表,我将不得不逐步停用活动脚手架并编写一个自定义助手。三列加入活动脚手架轨道

(我的丈夫有多年的经验,SQL,他同意3列连接表是正确的做法,他没有与任何导轨经验。)

我的三个车型分别是:员工,项目,角色其中角色是项目中的员工角色。我的表是员工_项目_角色

什么是DRY和其他有效的方式在轨道中这样做?如果有办法。

我没有比模型中的habtm和hmt以及控制器中的活动脚手架声明更多的注释。

[编辑] 有趣的错误:使用HMT方法在所有三个主要的车型还有EmployeeProjectRole模型收稿日期:

You have a nil object when you didn't expect it! 
The error occurred while evaluating nil.klass 

Extracted source (around line #5): 
2: <tr> 
3:  <% 
4:  active_scaffold_config_for(@record.class).subform.columns.each :for => @record, :flatten => true do |column| 
5:  next unless in_subform?(column, parent_record) and column_renders_as(column) != :hidden 
6:  -%> 
7:  <th<%= ' class="required"' if column.required? %>><label><%= column.label %></label></th> 
8:  <% end -%> 

[编辑2] 发现这个article三元协会(使用这个词在谷歌进一步搜索想出了什么其他)。在主力车型我注释掉的第一行遵循相应的文章:

# has_many  :employees_projects_roles 
    has_many  :roles,  :through => :employees_projects_roles 
    has_many  :projects, :through => :employees_projects_roles 

我收到此错误:

ActiveRecord::HasManyThroughAssociationNotFoundError in EmployeesController#index 
Could not find the association :employees_projects_roles in model Employee 

这似乎并没有成为一个active_scaffold错误,但一个ActiveRecord错误。这似乎意味着has_many :employees_projects_roles需要在那里,尽管文章建议。 2008年的API变化可能?

+0

伟大的建议! Active_scaffold期望EmployeeProjectRole模型在使用hmt方法时具有控制器。我会研究这两个环节。 – 2009-09-11 22:02:02

回答

0

我发布了相关问题here。在模型中声明关联时使用:join_table

错误消息“无对象”我正在参与未实例化的对象。有时候,当表格中没有数据时,消息就会出现。

最后一条错误消息,我没有回答。

感谢您的回复。 SO在问我是否想要发放奖金,但我认为这是你刚刚获得的那些问题之一,并且在解决其他问题时会消失。有时候,继续前进比试图找出原因更实际。

0

你可以用于employees_projects_roles创建一个模型,然后指定两个的has_many:通过协会:

has_many :roles, :through => :employees_projects_role, :source => :employees_projects_roles 
    has_many :projects, :through => :employees_projects_role, :source => :employees_projects_roles 
0

有一个插件acts_as_activity_loggable其与3列(actualy它是6,因为每个对象由类型所定义的表和id)。

您可能想要查看它以供参考。它具有:

  • 罪魁祸首(致使所述活动的对象,通常用户)
  • 引用的项(活性被记录的对象)
  • 活动可记录的(将其制成罪魁祸首参考所引用的项目对象)

简单示例:用户(罪魁祸首)为餐馆(引用的项目)创建审阅(活动记录)。

+0

我似乎无法通过Google找到它。在敏捷Web开发中找到了它的参考,但链接到了他的网站,该网站没有任何有关插件的信息。 – 2009-09-11 22:15:47

+0

请尝试此链接:http://thetacom.info/2008/01/10/acts_as_activity_logged/ – Eimantas 2009-09-12 07:44:28

1

首先我同意,看来你需要一个3列连接表。我还没有用ActiveRecord来做这件事,我认为你写一个通过两个has_many through关系实现这个功能的自定义模型的方法不是一个坏主意。

在你的特殊情况下,你可以考虑使用一个插件,以良好的方式处理角色的复杂性。使用此工具的好经验:acl9

您可以使用此相当有用的插件将角色分配给单个项目实体上的单个用户,并负责处理其余部分。

+1

Acl9是一个伟大的宝石,你发现!谢谢,我将更多地关注网站的其他部分。但是,在这种情况下,角色是项目中的员工角色,而不是用户角色和权限。虽然谢谢!这颗宝石看起来很棒! – 2009-09-11 22:08:28