Rails – 如何在数据库中存储“has_many”复选框关联?

我有表User和表Categories

这两个表之间的关系:

  • 用户has_many :categories
  • category belongs_to :user

我想在用户的(标准)编辑页面上显示带有复选框的类别列表。 当这个用户检查一些复选框时,我想保存它们,然后在下次打开页面时显示为已选中。

但是如何在视图中呈现复选框? 以及如何存储用户在数据库中检查的复选框的信息? 我的第一个想法是使用user_idcategory_id创建一个类似user_categories的表,但不确定这种方法的效果如何。

现在实施这项任务的最佳方法是什么?

除了引入强参数外,最近没有太大变化。 您仍然希望使用has_and_belongs_to_manyhas_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帮助程序轻松实现复选框。