在迁移期间在ActiveRecord concat上跳过验证?

时间:2013-04-11 14:49:19

标签: ruby-on-rails ruby rails-migrations

我有一个迁移,它使用ActiveRecord concat方法将对象添加到另一个对象的has_many关系。自创建迁移以来,我已向父模型添加了一个包含验证的新属性。

不幸的是,早期的迁移被破坏了,因为concat尝试保存父对象,并且验证找不到关联的属性(它还没有存在)。我是否错误地进行了数据迁移?

以下是迁移:

class RemoveTransportKeyFromInvites < ActiveRecord::Migration
  def up
    Invite.find_each do |invite|
      transport_key = Invite.where(id: invite.id).pluck(:transport_key).first
      guest_user = GuestUser.first_or_create!(transport_key: transport_key)
      guest_user.invites << invite
    end
    remove_column :invites, :transport_key
  end

  def down
    add_column :invites, :transport_key, :string
  end
end

模特:

class Invite < ActiveRecord::Base
  # some code omitted
  validates_presence_of :inviter_email
  # rest of code omitted

导致此错误:

undefined method `inviter_email' for #<InviteToMeal:0x007f8ece07c060>

谢谢,非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

规定的方法是在迁移中定义“存根”模型,以便不加载实际模型(带有验证)。 find_each和其他ActiveRecord调用仍然有效。

class RemoveTransportKeyFromInvites < ActiveRecord::Migration
  class Invite < ActiveRecord::Base; end

  def up
    # etc..

有关详细信息,请参阅this guide