向 table 添加仅包含父模型 ID 的条目
Add entry to table consisting only of parent model id
我在一个应用程序中有两个模型:Person
和 Director
; person 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
数组。
我在一个应用程序中有两个模型:Person
和 Director
; person 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
数组。