Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Rails迁移在另一个表中创建条目时更新现有记录_Sql_Ruby On Rails_Migration_Sql Update_Insert Update - Fatal编程技术网

Sql Rails迁移在另一个表中创建条目时更新现有记录

Sql Rails迁移在另一个表中创建条目时更新现有记录,sql,ruby-on-rails,migration,sql-update,insert-update,Sql,Ruby On Rails,Migration,Sql Update,Insert Update,我正在尝试为我的Rails应用程序设置测试邀请。我有一个邀请模型和一个用户模型 用户有一个邀请\u id。我正在验证用户必须有一个邀请\u id,并且它应该是唯一的。我想写一个迁移,这样我就可以更新我的现有用户,使其拥有一个邀请id 以下是我的邀请模型: # Table name: invitations # # id :integer not null, primary key # sender_id :integer # recip

我正在尝试为我的Rails应用程序设置测试邀请。我有一个邀请模型和一个用户模型

用户有一个邀请\u id。我正在验证用户必须有一个邀请\u id,并且它应该是唯一的。我想写一个迁移,这样我就可以更新我的现有用户,使其拥有一个邀请id

以下是我的邀请模型:

# 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
为了保证唯一性,我必须在邀请表中创建记录,并将相应的ID分配给用户记录

有人能为同样的问题提出迁移建议吗


提前谢谢

如果您已经为您的邀请和用户进行了迁移,那么您应该真正将邀请填充放在定制的rake任务中。将迁移严格地用于表操作始终是一种良好的做法

/lib/tasks/distribution_investments.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
您的现有用户将通过邀请id创建并关联邀请

或运行您可以执行的所有任务:

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
class AddInvitationID,:收件人\u电子邮件=>,:令牌=>,:发送时间=>Time.now)
user.update\u属性(:invitation\u id,invitate.id)
将“已更新的用户{user.id}与邀请{u id{invite.id}”放在一起
其他的
放置“用户已具有邀请\u id”
结束
结束
结束
def自动关闭
删除\u列:用户,:邀请\u id
结束
结束

谢谢克里斯。这是一个很好的解决方案。出于好奇,我们为什么不使用迁移呢?我所有正在开发此应用程序的同事(以及潜在的合作者)也必须单独运行rake db:distribute_邀请函,以便在他们的系统中运行此应用程序。刚刚从噩梦般的经历中了解到,每当迁移中存在种子数据依赖时,我总是在以后后悔。使跟踪任务更加困难,并且在必要时无法重新运行任务。我在团队环境中工作过,每当我们有需要在现有表中填充数据的自定义任务时,我们总是使用/lib/tasks。如果您或其他任何人需要做同样的事情,他们可以直接附加到文件中,这样您的所有数据操作都是集中化的添加迁移解决方案和更健壮的rake任务谢谢Chris!我能够使用您提供的详细信息编制一个解决方案。您忘记了在您的rake任务中添加
:环境
依赖项。在这种情况下,无法定义模型。请更新它,以避免复制您的代码时出现错误。
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