Ruby on rails 将两个用户关联到一个模型
让两个用户属于同一型号(票证)有点问题 在我正在构建的bug跟踪器中,Ticket是需要对项目执行的单个任务项。它有两个用户连接到它,Ticket.raised\u by和Ticket.assigned\u to。创建用户 问题是我总是在Ruby on rails 将两个用户关联到一个模型,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,model-associations,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,Model Associations,让两个用户属于同一型号(票证)有点问题 在我正在构建的bug跟踪器中,Ticket是需要对项目执行的单个任务项。它有两个用户连接到它,Ticket.raised\u by和Ticket.assigned\u to。创建用户 问题是我总是在Tickets\create操作上引发ActiveRecord::AssociationTypeMismatch异常,并显示类似于 User(#81485590) expected, got String(#68375030) 这是票证的代码。rb:
Tickets\create
操作上引发ActiveRecord::AssociationTypeMismatch
异常,并显示类似于
User(#81485590) expected, got String(#68375030)
这是票证的代码。rb
:
# Table name: tickets
#
# id :integer not null, primary key
# title :string(255)
# description :text
# status :string(255) default("open")
# priority :boolean default(FALSE)
# project_id :integer
# raised_by_id :integer default(0)
# assigned_to_id :integer default(0)
# created_at :datetime
# updated_at :datetime
class Ticket < ActiveRecord::Base
validates :title, :presence => true
validates :status, :presence => true
belongs_to :project
belongs_to :raised_by, :foreign_key => 'raised_by_id', :class_name => 'User'
belongs_to :assigned_to, :foreign_key => 'assigned_to_id', :class_name => 'User'
before_create do
self.raised_by = current_user
end
state_machine :status, :initial => 'open' do
# when a ticket is "claimed" by a developer
event :work do
transition any => :working_on
end
# posted the solved ticket to the dev server (or VM)
event :post do
transition any => :posted
end
# ticket is under review by another developer
event :review do
transition any => :reviewed
end
# review is completed and confirmed. only reviewed or flagged tasks can be completed.
event :complete do
transition [:review, :flagged] => :completed
end
# occurs when the project is completed
event :close do
transition any => :closed
end
# Special treatment for administrators. Sends them a Message detailing the flagged issue.
event :flagged do
transition any => :flagged
end
end
end
#表名:票据
#
#id:整数不为空,主键
#标题:字符串(255)
#说明:文本
#状态:字符串(255)默认值(“打开”)
#优先级:布尔默认值(FALSE)
#项目id:整数
#由\u id引发的\u:整数默认值(0)
#已将\分配给\ id:整数默认值(0)
#创建时间:datetime
#更新时间:datetime
类票证true
验证:status,:presence=>true
属于:项目
属于:引发者,:外键=>'引发者id',:类名=>'用户'
属于:分配给,:外部\u键=>“分配给\u id”,:类\u名称=>“用户”
在你创建之前
self.raised\u by=当前用户
结束
状态机器:状态,:初始=>“打开”do
#当开发人员“认领”票证时
活动:做什么
转换任意=>:在上工作
结束
#将已解决的票证发布到开发服务器(或VM)
活动:post do
转换任意=>:已发布
结束
#票正在由另一个开发者审核
活动:复习
转换任意=>:已审阅
结束
#审查已完成并确认。只能完成已审核或标记的任务。
事件:完成任务
转换[:审阅,:标记]=>:已完成
结束
#在项目完成时发生
事件:关闭do
转换任意=>:关闭
结束
#对行政人员的特殊待遇。向他们发送一条消息,详细说明标记的问题。
事件:标记的do
转换任意=>:已标记
结束
结束
结束
我不知道您的身份验证是如何设置的,但我猜您的型号没有访问当前用户的权限,因此此代码失败,原因是:
before_create do
self.raised_by = current_user
end
有多种方法可以访问模型中的当前\u用户
,但其中涉及一些风险(例如,它不是线程安全的)。有关示例,请参见
但是,您可能希望在控制器中处理此问题,而不是使用钩子来设置用户:
@ticket = Ticket.create(:raised_by => current_user, .....)
建议您错误地执行以下操作:
Ticket.assigned_to = 123
而不是
Ticket.assigned_to_id = 123
在代码的某个地方。您可以在分配票证的位置张贴视图/控制器代码吗?可能当前用户是字符串
它是怎么进入模型的?用户会话是控制器的业务。在您的表单上,是否有一个“分配给”字段(可能是一个选择框),其中每个用户的名称作为每个值? 如果是这样,当您更新控制器中的_属性时,它将尝试将该字段的字符串值放入指定的_-to关联中,这将与您输入的错误中断 我已经描述过了 将该字段重命名为“assigned_to_id”,并确保该字段的值是每个相应用户的id,而不是他们的名称
Ticket.assigned_to_id = 123