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

时间:2013-10-28 11:58:18

标签: ruby-on-rails ruby checkbox associations has-many

我有用户表和类别表。

这两个表之间的关系:

  • 用户has_many :categories
  • 类别belongs_to :user

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

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

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

3 个答案:

答案 0 :(得分:3)

除了引入强参数外,最近没有太大变化。您仍然希望使用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

答案 1 :(得分:2)

你可以采取habtm方法。

然后在用户表单部分,添加字段

 <div class="field"> 
   <%= f.label "Categories" %><br /> 
   <% 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 %> 
 </div>

其中category.name是您的类别模型中的字段。

这应该有效。

然后在您的用户索引视图中

<% @users.each do |user| %>
<%= user.categories.collect(&:name).join(",") %>
<% end %>

它应该显示用户的相关类别。别忘了在用户模型attr_acessible字段中添加:category_ids。否则会弹出质量保证安全

答案 2 :(得分:1)

您可能希望使用has_many :through实现多对多关系,而不是让类别属于用户(意味着某个类别只能拥有一个用户,这是您想要的吗?

阅读has_many :through以帮助您入门。完成后,可以使用collection_check_boxes帮助程序轻松实现复选框。