我试图弄清楚这个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 %>
<div>
<%= check_box_tag "user[interest_id][]", interest.id, @user.interests.include (interest) %>
<%= interest.name %>
</div>
<% end %>
我认为一切看起来都很犹豫但是当我运行视图时我得到了错误:
InterestController#edit中的NoMethodError - #User的未定义方法`interest':0x4797ddc
我是否需要创建一个单独的模型/表格来连接用户对事件的兴趣? 喜欢InterestsofUsers(id,user_id,interest_id)?我认为HABTM关系将消除对此的需求......
困惑
答案 0 :(得分:5)
有几个问题。首先,您需要为兴趣和用户创建连接表。它的名称是两个表的组合,按字母顺序排列。它必须没有主键。这是一个例子:
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中多对多关系的问题经常出现,我写了一篇名为basic many-to-many associations的文章来解释如何使用habtm
vs { {1}},以及它们之间的差异。
答案 1 :(得分:-1)