向 table 添加仅包含父模型 ID 的条目

Add entry to table consisting only of parent model id

我在一个应用程序中有两个模型:PersonDirectorperson has_one director。一个人可以是很多东西(官员、承包商等和主管);如果他们是导演,我只想将他们的用户 ID 存储在导演 table 中,仅此而已。

因此我设置的table只包含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)

我希望表单上的每个人条目都有一个嵌套的单选按钮,如果设置为 "Yes" 并且 removes/doesn 不创建,则在董事 table 中创建一个条目如果设置为 "No." 的条目看起来很简单,但我意识到我不知道该怎么做,因为单选按钮的显式值不会保存到数据库中。

有什么好的方法可以解决这个问题吗?

如果不同角色不需要任何其他属性,那么拥有一个包含主管、官员、承包商等记录的角色 table 可能更有意义,而不是让他们分开 table 秒。这也使它可以灵活地通过管理面板轻松添加其他角色,而不是通过新的 table 和迁移。

然后您可以加入 table 以允许用户通过单选按钮或复选框属于其中一个或多个角色。

用户 - has_and_belongs_to_many:角色
角色 - has_and_belongs_to_many :users

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

确保在控制器的 user_params

中允许 :role_ids => []

您可以将 attr_accessor 添加到您的 Person 模型中,例如 is_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

然后在您的表单中,您可以添加单选按钮:

<%= 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) %>

然后你可以在persons_helper.rb中创建一个助手:

def is_director?(person)
  #whatever the logic is to check if a person is a director
end

您还需要将 is_director 添加到控制器中强参数的 permit 数组。