代码之家  ›  专栏  ›  技术社区  ›  Elizabeth Buckwalter

带活动脚手架的三柱轨道连接

  •  3
  • Elizabeth Buckwalter  · 技术社区  · 17 年前

    我有一个有三列的连接表。我试过用has many through和habtm定义这三个模型。我正在使用活动的脚手架,只是为了CRUD的功能,然后它将被逐步淘汰。我有一种感觉,如果我想要一个三列连接表,我必须尽早淘汰活动脚手架,并编写一个自定义助手。

    (我丈夫在SQL方面有多年的经验,他同意3列联接表是正确的方法。他没有铁路方面的经验。)

    我的三个模型是:员工、项目、角色,其中角色是项目中的员工角色。我的表是员工项目角色

    在Rails中这样做的干法和其他有效方法是什么?如果有办法的话。

    除了模型中的注释掉的habtm和hmt,以及控制器中的活动scaffold语句,我没有更多的内容。

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

    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
    

    这似乎不是一个活动的脚手架错误,而是一个活动的记录错误。这似乎意味着 has_many :employees_projects_roles 尽管这篇文章提出了建议,但仍然需要在场。从2008年起可能会改变API?

    4 回复  |  直到 12 年前
        1
  •  1
  •   xijo    17 年前

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

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

    您可以使用这个非常有用的插件为单个项目实体上的单个用户分配角色,剩下的由它来处理。

        2
  •  0
  •   Doug Hays    17 年前

    您可以为创建模型 employees_projects_roles 然后指定两个具有多个:通过关联:

      has_many :roles, :through => :employees_projects_role, :source => :employees_projects_roles
      has_many :projects, :through => :employees_projects_role, :source => :employees_projects_roles
    
        3
  •  0
  •   Eimantas    17 年前

    有一个插件作为“活动日志”,它是一个有3列的表(实际上是6列,因为每个对象都是由类型和ID定义的)。

    你可能想查一下它作为参考。它有:

    • 罪犯(导致活动的对象,通常是用户)
    • 引用的项(为其记录活动的对象)
    • 活动可记录(使罪犯引用引用的项的对象)

    简单示例:用户(罪犯)为餐厅(引用的项目)创建一个评论(活动可记录)。

        4
  •  0
  •   Community Mohan Dere    9 年前

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

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

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

    谢谢你的回复。所以是问我是否想悬赏,但我认为这是你刚得到的问题之一,在解决其他问题时,它就消失了。有时候,继续下去比试图找出原因更务实。