Ruby on rails 将条目添加到仅包含父模型id的表中

Ruby on rails 将条目添加到仅包含父模型id的表中,ruby-on-rails,ruby-on-rails-4,activerecord,associations,nested-forms,Ruby On Rails,Ruby On Rails 4,Activerecord,Associations,Nested Forms,我在一个应用程序中有两个模型:Person和Director个人拥有一个董事。一个人可以是很多东西(官员、承包商等和主管);如果他们是一名董事,我只想将他们的用户id存储在directors表中 因此,我设置的表仅由4列组成: mysql> show columns in directors; +------------+----------+------+-----+---------+----------------+ | Field | Type | Null |

我在一个应用程序中有两个模型:
Person
Director
<代码>个人拥有一个董事。一个人可以是很多东西(官员、承包商等和主管);如果他们是一名董事,我只想将他们的用户id存储在directors表中

因此,我设置的表仅由4列组成:

mysql> show columns in directors;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| person_id  | int(11)  | YES  | MUL | NULL    |                |
| created_at | datetime | YES  |     | NULL    |                |
| updated_at | datetime | YES  |     | NULL    |                |
+------------+----------+------+-----+---------+----------------+
4 rows in set (0.03 sec)
我希望表单上的每个人条目都有一个嵌套的单选按钮,如果设置为“是”,则在directors表中创建条目,如果设置为“否”,则删除/不创建条目。看起来很简单,但我意识到我不知道如何做,因为单选按钮的显式值不会保存到数据库中


有没有一个好的方法来实现这一点?

如果不同的角色不需要任何其他属性,那么创建一个包含主管、高级职员、承包商等记录的角色表可能会更有意义,而不是将其作为单独的表。这还使它能够灵活地通过管理面板轻松添加其他角色,而不是通过新表和迁移

然后,您可以拥有一个联接表,允许用户通过单选按钮或复选框属于其中一个或多个角色

用户-拥有且属于多个:角色
角色-拥有且属于多个:用户

<legend>Roles</legend>
<div class="form-group">
  <%= f.collection_check_boxes(:role_ids, Role.all, :id, :name, :item_wrapper_class => 'inline') %>
</div>
角色
“内联”)%%>

确保允许:角色ID=>[]在控制器的用户参数中

您可以将
attr\u访问器
添加到
Person
模型中,例如
is\u director
。这是一个临时属性,不会存储在数据库中。然后根据
is_director
的值,您可以使用回调来设置逻辑,使用户成为自己的控制器

class Person < ...
  ...

  attr_accessor :is_director
  after_create  :make_director

private

  def make_director
    if self.is_director
      #your logic to make the user their own director
    else
      #some other logic
    end
  end
end

您还需要将
is\u director
添加到控制器中强参数的
permit
数组中。

对不起,我好像很快就和您通话了;我还以为它能用呢。我收到一个错误:
未定义的方法id
,它与视图中的单选按钮有关。更新了答案。不确定你的逻辑是什么,以检查一个人是否是导演,但你可以把它放在助手方法。谢谢更新。我目前正在排除有关
设置人员id
的错误
未定义方法
parent\u id`。如果这个错误有任何明显的原因,我会洗耳恭听。答案背后的想法是展示
attr\u访问器和回调的使用。我不熟悉您的代码,无法完全回答问题。现在还不清楚为什么需要一个单独的directors表(用于现在构建表的方式)。为什么不能在persons表上有一个布尔字段来指示用户是否是导演?如果希望directors表同时包含
人员id
及其
经理id
,则缺少
经理id
外键
<%= f.label :is_director %><br />
<%= f.label :is_director, "Yes", :value => "true"  %>
<%= f.radio_button :is_director, true, :checked => is_director?(@person)  %>
<%= f.label :is_director, "No", :value => "false" %>
<%= f.radio_button :is_director, false, :checked => !is_director?(@person) %>
def is_director?(person)
  #whatever the logic is to check if a person is a director
end