【问题标题】:Three Column Join in Rails with Active Scaffold带活动脚手架的导轨中的三柱连接
【发布时间】:2009-09-11 21:34:59
【问题描述】:

我有一个包含三列的连接表。我尝试用 a has many through 和 habtm 定义这三个模型。我仅将活动脚手架用于 CRUD 功能,然后它将被逐步淘汰。我有一种感觉,如果我想要一个三列连接表,我将不得不提前逐步淘汰活动脚手架并编写一个自定义助手。

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

我的三个模型是:Employee、Project、Role 其中 Role 是项目中的员工角色。我的表是employees_projects_roles

在 Rails 中执行此操作的 DRY 和其他有效方法是什么?如果有办法。

除了模型中注释掉的 habtm 和 hmt 以及控制器中的 active 脚手架语句之外,我没有更多的东西。

[编辑] 有趣的错误:|在所有三个主要模型以及 EmployeeProjectRole 模型中使用 hmt 方法接收:

当你没想到时,你有一个 nil 对象!
评估 nil.klass 时发生错误

提取的源代码(第 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 需要在那里,尽管文章建议。 API 可能从 2008 年开始发生变化?

【问题讨论】:

  • 好建议! Active_scaffold 期望 EmployeeProjectRole 模型在使用 hmt 方法时有一个控制器。我会研究这两个链接。

标签: ruby-on-rails


【解决方案1】:

首先我同意,您似乎需要一个 3 列连接表。我还没有使用 ActiveRecord 完成此操作,我认为您编写自定义模型通过两个 has_many through 关系实现此功能的方法不会是一个坏主意。

在您的特殊情况下,您可以考虑使用一个插件来很好地处理角色的复杂性。不错的体验:acl9

您可以使用这个非常有用的插件为单个项目实体上的单个用户分配角色,它会处理其余的事情。

【讨论】:

  • Acl9 是你发现的一个伟大的宝石!谢谢,我会在网站的另一部分进行更多研究。但是,在这种情况下,角色是项目中的员工角色,而不是用户角色和权限。不过谢谢!这颗宝石看起来很棒!
【解决方案2】:

您可以为employees_projects_roles 创建一个模型,然后指定两个 has_many :through 关联:

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

【讨论】:

    【解决方案3】:

    有一个插件acts_as_activity_loggable,它是一个有3列的表(实际上是6,因为每个对象都是由类型和id定义的)。

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

    • 罪魁祸首(导致活动的对象,通常是用户)
    • 引用的项目(记录活动的对象)
    • Activity Loggable(使罪魁祸首引用被引用项目的对象)

    简单示例:用户(罪魁祸首)为餐厅(引用项目)创建评论(可记录活动)。

    【讨论】:

    • 我似乎无法通过 Google 找到它。在 Agile Web Development 找到了对它的引用,但是链接到了他的网站,该网站没有关于插件的任何信息。
    【解决方案4】:

    我发布了一个相关问题here。答案涉及在模型中声明关联时使用:join_table

    错误消息“nil object”我涉及到对象未实例化。有时,当表中没有数据时,似乎会出现该消息。

    最后一条错误信息,我没有答案。

    感谢您的回复。所以问我是否想悬赏,但我认为这是你刚刚遇到的问题之一,在解决其他问题时它会消失。有时,继续前进比试图找出原因更务实。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      • 2018-02-09
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多