Ruby on rails 将两个用户关联到一个模型

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:

让两个用户属于同一型号(票证)有点问题

在我正在构建的bug跟踪器中,Ticket是需要对项目执行的单个任务项。它有两个用户连接到它,Ticket.raised\u by和Ticket.assigned\u to。创建用户

问题是我总是在
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