首页 > 解决方案 > 如何修复在rails中创建has_and_belongs_to_many的错误

问题描述

我想在连接表中创建一条记录,但 rails 在两种情况下显示了两个错误,我不想生成第三个模型。

@channel = Channel.find(params[:channel_id])
 if @channel.users.create!(channel_id: params[:channel_id], user_id: params[:user_id])
     flash[:success] = "U Succeed:)"
     redirect_to request.referrer
 else
     flash[:danger] = "U Nit Succeed:H"
     redirect_to request.referrer
 end

第二种情况

 if Channel.users.create!(channel_id: params[:channel_id], user_id: params[:user_id])
     flash[:success] = "U Succeed:)"
     redirect_to request.referrer
 else
     flash[:danger] = "U'r Not Succeed:H"
     redirect_to request.referrer
 end

我想保存attrs在连接表中。根据rails官方网站指南,出了什么问题?

第一个错误:

用户的未知属性“channel_id”。

第二个错误:

类的未定义方法“用户”:0x00007feaa0312058

标签: ruby-on-railshas-and-belongs-to-many

解决方案


我假设你有这样的关联:

class User < ActiveRecord::Base
  has_and_belongs_to_many :channels
end

class Channel < ActiveRecord::Base
  has_and_belongs_to_many :users
end

现在你正试图这样做:

@channel.users.create!(channel_id: params[:channel_id], user_id: params[:user_id])

这将尝试创建一个新的User类对象,因为您之间没有模型,只有一个中间表。相反,您可以这样做:

# If you don't have the user object already
user = User.find params[:user_id]

# This will create a record in the mid table
@channel.users << user

这将在中间表中创建一条新记录,并且现有记录也将按原样存在。如果你这样做:

@channel.users = user

这将从该频道的中间表中删除所有现有的关联用户记录,并添加与该用户的新关联记录。

当你尝试这样做时:

Channel.users.create!(channel_id: params[:channel_id], user_id: params[:user_id])

这根本无效,因为类与类Channel没有任何直接关系,User但类的实例Channel可能与类的实例相关联User


推荐阅读