我想在联接表中创建一条记录,但是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”。
第二个错误:
Class:0x00007feaa0312058的未定义方法`users'
答案 0 :(得分:1)
我假设您具有这样的关联:
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
类对象,因为它们之间没有Model,而您只有一个中间表。相反,您可以这样做:
# 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
类的实例可能与{{1 }}类。
答案 1 :(得分:0)
对于第一种情况,我建议您应该这样做
@channel.user_ids = @channel.user_ids + [params[:user_id]]
它将创建连接表记录,您可以确定是否可以尝试优化方法。
答案 2 :(得分:0)
您也可以使用push或<<方法来代替create:Channel.users.push(attrs)或Channel.users <<(attrs)和第二个答案也很好,但是.ids不太可读 或者您可以按ID查找频道并使用它:channel.users.create(attrs)
请参阅api.rubyonrails.org,然后在搜索栏中搜索has_and_belongs_to_many方法