Rails – 如何在数据库中存储“has_many”复选框关联?
我有表User和表Categories 。
这两个表之间的关系:
- 用户
has_many :categories
- category
belongs_to :user
我想在用户的(标准)编辑页面上显示带有复选框的类别列表。 当这个用户检查一些复选框时,我想保存它们,然后在下次打开页面时显示为已选中。
但是如何在视图中呈现复选框? 以及如何存储用户在数据库中检查的复选框的信息? 我的第一个想法是使用user_id
和category_id
创建一个类似user_categories的表,但不确定这种方法的效果如何。
现在实施这项任务的最佳方法是什么?
除了引入强参数外,最近没有太大变化。 您仍然希望使用has_and_belongs_to_many
或has_many :through
关系,然后直接分配关系的ID。 您需要设置一个表单,该表单传递一系列选定的ID,以便它们像{user: {category_ids => [1,2,3]}
一样进入。
class User < ActiveRecord::Base has_and_belongs_to_many :categories end
在控制器中
def update current_user.update(user_params) end def user_params params[:user].permit( {:category_ids => []} ) end
你可以采取habtm方法。
然后在用户表单部分,添加字段
<%= f.label "Categories" %>
<% for category in Category.all %> <%= check_box_tag 'user[category_ids][]', category.id, @user.category_ids.include?(category.id), :id => dom_id(category) %> <%= label_tag dom_id(category), category.name, :class => "check_box_label" %> <% end %>
其中category.name是类别模型中的字段。
这应该工作。
然后在您的用户索引视图中,
<% @users.each do |user| %> <%= user.categories.collect(&:name).join(",") %> <% end %>
它应该显示用户的相关类别。 别忘了在用户模型attr_acessible字段中添加:category_ids。 否则会出现大规模的协助安全
您可能希望使用has_many :through
来实现多对多的关系has_many :through
而不是让类别属于用户(意味着类别只能拥有一个用户,这是您想要的吗?
读一读has_many:来帮助你入门。 完成后,可以使用collection_check_boxes帮助程序轻松实现复选框。