当前位置:  开发笔记 > 程序员 > 正文

Rails - HABTM关系...存储用户的复选框值

如何解决《Rails-HABTM关系存储用户的复选框值》经验,为你挑选了1个好方法。

我试图弄清楚这个HABTM关系问题是为了我的数据库中的用户的利益存储.兴趣表包含具有id和名称的不同兴趣列表(即:id = 1,name ='Music')

我有一个用户模型=> user.rb

has_and_belongs_to_many :interests

和兴趣模型=> interest.rb

has_and_belongs_to_many :users

现在我正在尝试从复选框列表中编辑或更新用户的兴趣选择.控制器看起来像=>

def edit
#@interests = Interest.find(:all)

  @title = "Edit Interest"
  @user = User.find(session[:user_id])
  @user.interest ||= Interest.new
  interest = @user.interest
  if param_posted?(:interest)
      if @user.interest.update_attributes(params[:interest])
          flash[:notice] = "Changes saved."
          redirect_to :controller => "users", :action => "index"
      end
  end
end

而param_posted函数看起来像这样

  def param_posted?(sym)
  request.post? and params[sym]
  end

视图逻辑如下所示:

<% for interest in @interest %>
<%= check_box_tag "user[interest_id][]", interest.id, @user.interests.include (interest) %> <%= interest.name %>
<% end %>

我认为一切看起来都很犹豫但是当我运行视图时我得到了错误:

InterestController#edit中的NoMethodError - #User的未定义方法"interest":0x4797ddc

我是否需要创建一个单独的模型/表格来连接用户对事件的兴趣?喜欢InterestsofUsers(id,user_id,interest_id)?我认为HABTM关系将消除对此的需求......

困惑



1> Jaime Bellmy..:

有几个问题.首先,您需要为兴趣和用户创建连接表.它的名称是两个表的组合,按字母顺序排列.它必须没有主键.这是一个例子:

class CreateInterestsUsersJoinTable < ActiveRecord::Migration
  self.up
    create_table :interests_users, :id => false do |t|
      t.integer :interest_id
      t.integer :user_id
    end
  end

  self.down
    drop_table :interests_users
  end
end

以这种特定方式命名连接表是Rails如何自动查找它的方法.

此外,请记住一个用户没有一个兴趣,用户有很多.这就是没有@user.interest方法的原因.有一个@user.interests方法,它返回该用户的所有兴趣的数组,您可以根据需要循环.

除此之外,我真的让你的控制器更加RESTful.该编辑操作试图处理至少2种不同类型的请求,编辑和更新,它们应该分开.

修复此部分后,发布另一个关于如何让控制器更加安静的问题,我或其他人可以帮助您.对于那些将来搜索stackoverflow数据库的人来说,最好将这两个问题放在单独的问题中.

更新:关于Rails中多对多关系的问题经常出现,我写了一篇名为基本多对多关联的文章来解释如何使用habtmvs has_many :through,以及它们之间的差异.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有