ruby-on-rails - 如何修复在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
解决方案
我假设你有这样的关联:
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
。
推荐阅读
- node.js - 如何将语言转换为阿拉伯语 infermedica?
- python - 系统错误:xmlsec 中内部例程的空参数
- python - 网页抓取 Selenium 和 PhantomJS 返回产品详细信息的文本
- java - 如何以编程方式将文件保存在手机本地存储中?
- javascript - 如何获取用户从 JS 日历中选择后 30 天的日期
- c++ - 如何覆盖运算符 = 以复制智能指针?
- c++ - 为什么我不能在 c++ vscode 中使用字符串?
- c# - C# 随机数生成器是否保证稳定?
- r - RODBC 包的替代方案,用于从 R 连接到 MS Access
- image - 使用面板小部件以交互方式更新 Holoviews 图像