2013-10-28 51 views
4

我有表用户和表分类导轨 - 如何存储数据库“的has_many”复选框关联?

这两个表之间的关系:

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

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

但如何呈现在视图中的复选框?以及如何存储关于用户在数据库中签入的复选框的信息? 我的第一个想法是要创建一个表像user_categoriesuser_idcategory_id,但不知道这种方法的效果如何。

什么是时下执行这一任务的最佳方法是什么?

回答

1

你可能想使用has_many :through而不是类别属于用户(指的是类实现多对多的关系永远只能有一个用户,是你想要的吗?

has_many :through读什么让你开始。一旦你做到这一点的复选框使用collection_check_boxes帮手容易实现。

3

没有太大最近发生了变化,除了大力引进参数,你仍然想使用一个has_and_belongs_to_manyhas_many :through关系然后直接分配关系的id,你需要setu p表单传递一个被选中的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 
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。其他质量assingment安全会弹出

+0

这并不解决问题乌尔 – curiousCoder

相关问题