我的应用程序中处理注册电子邮件的登录页面的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
答案 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
请记住,此迁移不可逆转,如果您将使用它仍然由您负责。祝您好运!