我有一个包含三列的连接表。我已经尝试定义这三个模型,其中包括一个有很多通过和habtm。我正在使用活动脚手架仅用于CRUD功能,然后它将被逐步淘汰。我有一种感觉,如果我想要一个三列连接表,我将不得不提前淘汰活动脚手架并编写一个自定义助手。
(我丈夫有多年的SQL经验,他同意3列连接表是正确的方法。他对rails没有任何经验。)
我的三个模型是:员工,项目,角色,其中角色是项目中的员工角色。我的表是employees_projects_roles
什么是DRY以及在rails中执行此操作的有效方法?如果有办法的话。
我没有比模型中的注释habtm和hmt以及控制器中的活动脚手架语句更多的东西。
[编辑] 有趣的错误:|在所有三个主要模型以及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(使用这个术语在Google上进一步搜索没有提供任何其他内容)。在主要模型中,我注释了第一行:
# 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 :(得分:1)
首先我同意,看起来你需要一个3列连接表。我还没有使用ActiveRecord,我认为你编写一个通过两个has_many through
关系来实现这个功能的自定义模型的方法并不是一个坏主意。
在您的特殊情况下,您可以考虑使用一个能够很好地处理角色复杂性的插件。这个的好经验:acl9
您可以使用这个非常有用的插件为单个项目实体的单个用户分配角色,并负责其余部分。
答案 1 :(得分: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
答案 2 :(得分:0)
有一个插件acts_as_activity_loggable,它作为一个包含3列的表(实际上它是6,因为每个对象都是由类型和id定义的)。
您可能需要查看它以供参考。它有:
简单示例:用户(罪魁祸首)为餐馆创建评论(活动可记录)(参考项目)。
答案 3 :(得分:0)
我发布了一个相关问题here。答案涉及在模型中声明关联时使用:join_table
。
错误消息“nil object”我参与了未实例化的对象。有时,当表中没有数据时,似乎会出现消息。
最后一条错误消息,我没有答案。
感谢您的回复。所以我在问我是否想要获得赏金,但我认为这是你刚刚得到的问题之一,并且在解决其他问题时会消失。有时,继续前进比试图找出原因更加务实。