Has_many 连接表,用于管理目的
Posted
技术标签:
【中文标题】Has_many 连接表,用于管理目的【英文标题】:Has_many Join table with a belongs to for admin purposes 【发布时间】:2018-10-12 17:01:29 【问题描述】:我正在编写一个用于规划社交媒体编辑日历的 Rails 日历应用程序。
我的人际关系是: 用户 has_many 日历,日历 has_many 用户
我正在尝试实现一个日历管理员,其中日历也属于管理员。管理员是创建日历的人。
我在这里到处搜索,发现只是 has_many 和 belongs_to 关系的不同选项,而不是将belongs_to 添加到连接关系中。
我已经尝试过:
class Calendar < ApplicationRecord
has_many :user_calendars
has_many :users, :through => :user_calendars
has_many :calendar_posts
has_many :posts, :through => :calendar_posts
belongs_to :admin, :class_name => :User
def add_calendar
Calendar.new(admin: self)
end
class CalendarsController < ApplicationController
def create
@calendar = Calendar.new(calendar_params)
current_user.add_calendar
if @calendar.save
redirect to @calendar
else
render :new
end
end
private
def calendar_params
params.require(:calendar).permit(:name, :user_id)
end
这只是呈现新的,我从服务器日志中得到的唯一东西是回滚。我输入了错误,它们是空的。
我也尝试过类似我在此处看到的另一篇文章,其中我从用户模型中删除了 add_calendar 方法和日历控制器中的那行代码,而是在私有下的日历控制器中有一个私有方法:
def set_admin
@calendar.admin.id = current_user.id
end
并且在日历控制器的顶部有:
before_action :set_admin, only: :create
这给了我堆栈错误语法警告
我还尝试添加迁移以将管理列添加到日历表中,类型为整数?
我确实为用户注册设置了 Devise,但如果可能的话,我试图让 Ashlie 使用它来实现此功能。
【问题讨论】:
【参考方案1】:def create
@calendar = Calendar.new(calendar_params)
# you're just missing this line
@calendar.admin = current_user
# this doesn't do anything, so I commented this out
# current_user.add_calendar
if @calendar.save
redirect_to @calendar
else
render :new
end
end
附注我不知道你为什么允许:user_id
作为def calendar_params
的一部分,因为你的Calendar
模型实际上没有:user_id
属性。:user_id
属性是UserCalendar
的一部分代替模型。
【讨论】:
我在创建表单中有 :user_id,因为我试图将其传递进去,但我错了。当我刚刚进行了您建议的更改时,我的程序视图中 的每个地方都变成了空白?【参考方案2】:我看到您在用户中创建了一个与当前无关的新实体日历,而不保存它。 请尝试:
@calendar = Calendar.new(calendar_params.merge(admin: current_user)
是的,您需要添加一个迁移,将 admin_id 添加到日历中
【讨论】:
如果我使用别名,admin_id 是否重要?我是个大新手。 是的,是附加关联,与many_to_many无关。因此,如果您添加 admin_id 并更改控制器代码作为响应,它应该可以工作以上是关于Has_many 连接表,用于管理目的的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4,通过连接表在has_many中指定自定义外键?
使用has_many创建表分类:through用于类别和帖子