由于查询格式错误,Rails活动记录对象保存操作失败

时间:2015-11-11 11:36:26

标签: mysql ruby-on-rails ruby-on-rails-4 rails-activerecord

我的应用程序中处理注册电子邮件的登录页面的Rails中存在问题。当用户被邀请加入应用程序时,会创建一个邀请活动记录实例,并向用户发送一封电子邮件,其中包含一个包含邀请ID的链接(随机字符串标记)。

然后,当点击链接时,我将该令牌存储在会话中,并且在服务层中的某一点,我更新它的状态'属性为'点击',如下所示:

    @invitation = Invitation.find_by_id(session[:registration][:invitation_token])

    unless @invitation.blank?
        session[:registration][:account_details]['referer'] = @invitation.promoter.username

        unless @invitation.status == APP_CONFIG['invitation_status']['clicked']
          @invitation.status = APP_CONFIG['invitation_status']['clicked']
          @invitation.save
        end
    end

执行@invitation.save行后,我收到一条活动记录错误:

!! #<ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'invitations.' in 'where clause': UPDATE `invitations` SET `status` = 'clicked', `updated_at` = '2015-11-11 11:07:24' WHERE `invitations`.`` = 'fd05ee5a-e790-48cc-9e7e-d30d3e88919b'>

由于某种原因,邀请的ID列名称似乎是从查询中省略的,我无法弄清楚原因。不确定出了什么问题或做了什么。

邀请迁移:

class CreateInvitations < ActiveRecord::Migration
  def change
    create_table :invitations, id: false do |t|
      t.string :id, limit: 36, :auto_increment => false
      t.string :promoter_id
      t.string :email
      t.string :status

      t.timestamps
    end
  end
end

邀请模特:

class Invitation < ActiveRecord::Base
  #region Callbacks
  before_create :set_uid
  #endregion

  belongs_to :promoter, class_name: 'User', foreign_key: 'promoter_id'

  private
  def set_uid
    self.id = SecureRandom.uuid unless self.id
  end
end

1 个答案:

答案 0 :(得分:1)

您应将id列标记为primary_key

create_table :invitations, id: false do |t|
  t.string :id, limit: 36, primary_key: true, auto_increment: false
  ...

我认为在您的情况下,解决此问题的最佳方法是删除表并使用正确的迁移再次创建它。但是如果有数据你不想放松,你也可以尝试这样做:

class MarkIdAsPrimaryKey < ActiveRecord::Migration
  def change
     change_column :invitations, :id, :string, limit: 36, primary_key: true, auto_increment: false
  end
end

请记住,此迁移不可逆转,如果您将使用它仍然由您负责。祝您好运!