Обновление Rails Обновление существующих записей при создании записей в другой таблице - PullRequest
3 голосов
/ 12 июля 2011

Я пытаюсь настроить бета-приглашения для моего приложения на Rails.У меня есть модель приглашения и модель пользователя.

У пользователя есть один идентификатор приглашения.Я проверяю, что у пользователя должен быть приглашение_ид, и оно должно быть уникальным.Я хочу написать миграцию, чтобы я мог обновить своих существующих пользователей, чтобы они имели идентификатор приглашения.

Вот моя модель приглашения:

# Table name: invitations
#
#  id              :integer         not null, primary key
#  sender_id       :integer
#  recipient_email :string(255)
#  token           :string(255)
#  sent_at         :datetime
#  created_at      :datetime
#  updated_at      :datetime

Чтобы гарантировать уникальность, мне придется создавать записив таблице приглашений, а также назначьте соответствующие идентификаторы для записей пользователей.

Может кто-нибудь предложить, пожалуйста, миграцию для того же самого?

Заранее спасибо!

1 Ответ

7 голосов
/ 12 июля 2011

Если вы уже выполнили миграцию для своих приглашений и пользователей, вам действительно следует поместить приглашение, заполняющее пользовательскую задачу rake.Всегда хорошая практика, чтобы сохранить ваши миграции строго для манипуляций с таблицами.

/ lib / tasks / distribte_invitations.rake

namespace :db do
  desc "Run all custom tasks"
  task :import_all => [:distribute_invitations, :some_other_data_import]

  desc: "Some other data import"
  task :some_other_data_import => :environment do
    puts "insert task code here"
  end

  desc: "Give existing user's invitations"
  task :distribute_invitations => :environment do
    for user in User.all
      if user.invitation_id.nil?
        invite = Invitation.create(:sender_id => <some id>, :recipient_email => <some email>, :token => <some token>, :sent_at => Time.now)
        user.update_attribute(:invitation_id, invite.id)
        puts "Updated user #{user.id} with invitation_id #{invite.id}"
      else
        puts "User already has an invitation_id"
      end
    end
  end
end

После того, как вы выполнили свою миграцию, чтобы предоставить вашим пользователям таблицу приглашенияможно запустить:

rake db:distribute_invitations

, и ваши существующие пользователи будут иметь приглашения, созданные и связанные с ними через приглашение_ид.

Или для запуска всех ваших задач, которые вы можете выполнить:

rake db:import_all

В этом случае очень просто вставить его в миграцию с помощью пользовательской миграции:

class AddInvitationID < ActiveRecord::Migration
  def self.up
    add_column :users, :invitation_id, :integer
    for user in User.all
      if user.invitation_id.nil?
        invite = Invitation.create(:sender_id => <some id>, :recipient_email => <some email>, :token => <some token>, :sent_at => Time.now)
        user.update_attribute(:invitation_id, invite.id)
        puts "Updated user #{user.id} with invitation_id #{invite.id}"
      else
        puts "User already has an invitation_id"
      end
    end
  end

  def self.down
    remove_colum :users, :invitation_id
  end
end
...