Вы всегда можете создать модель InviteCode, которая содержит случайно сгенерированный подлежащий погашению код, который может быть выдан по требованию и проверен в более поздний момент времени.
Например:
class User < ActiveRecord::Base
has_one :invite_code_used,
:class_name => 'InviteCode',
:foreign_key => 'user_redeemer_id'
has_many :invite_codes,
:foreign_key => 'user_creator_id'
end
class InviteCode < ActiveRecord::Base
belongs_to :user_creator,
:class_name => 'User',
:foreign_key => 'user_creator_id'
belongs_to :user_redeemer,
:class_name => 'User',
:foreign_key => 'user_redeemer_id'
end
Вы бы создали случайно сгенерированную строку для использования в качестве кода приглашения, предположительно где-то вроде before_validation
, чтобы гарантировать ее заполнение перед сохранением. Когда код погашен, свяжите код с созданным пользователем, чтобы вы могли увидеть, кто на самом деле его потребовал.
Создать код приглашения для пользователя так же просто, как например:
@invite_code = @user.invite_codes.create(:email => 'someone@example.com')
Вы можете добавить некоторые проверки при создании InviteCode, чтобы убедиться, что данный пользователь не создал больше, чем должен был, и любую другую бизнес-логику, которая может вам потребоваться.