当第一个用户在 Rails 中自我引用自身时,Heroku 不会播种

Heroku won't seed when first user is self-referencing itself in Rails

我正在尝试自我引用用户,所以在我的 user.rb:

# return all users created under this user (admin/manager)
has_many :customers, class_name: "User", foreign_key: :creator_id
# return this customer's creator
belongs_to :creator, class_name: "User"

在我的 schema.rb 中,在用户 table 中我有:

t.integer  "creator_id"

我在 Rails 中有一个种子文件,其中第一个声明的用户引用自身(通过 creator_id)。我尝试了以下方法,当我 rails db:seed 并且我可以 运行 localhost

中的应用程序时成功播种
u1 = User.new(first_name: "John", last_name: "Doe", email: "johndoe@example.com", password: "password", password_confirmation: "password", role_id: r1.id)
u1.creator_id = 1
u1.save

然而,当我在 Heroku 中播种时,它总是抛出一个错误:

ActiveRecord::RecordInvalid: Validation failed: Creator must exist

这将停止为其余用户播种。我想知道为什么我的本地主机可以接受但 Heroku 不允许。我究竟做错了什么?

感谢任何帮助。谢谢:-)

您的开发环境的数据库可能依赖于从 1 开始的 ID...但您不能假设所有数据库都会这样做。

我建议您实际上从数据库中提取创建者的用户模型并使用它拥有的实际 ID。

"There are no user in the prod database yet. It is the very first user I'm trying to seed. I can't create it so that the db will assign a user id because it needs a creator_id which relies on its own user id."

啊...那么你有问题...因为你已经声明 creator_id 必须存在,你的代码将使用你提供的 ID 查找 Usercreator_id 并找不到它...因此您永远无法添加第一个 User.

取决于这个约束是刚刚在Rails(即validates :creator, presence: true)中设置还是在数据库中设置a proper databaseNOT NULL</code> CONSTRAINT`),将取决于要使用的解决方案。</p> <p>如果它只是在 Rails 中,那么您可以简单地保存 <code>User 而无需 运行 验证回调,然后 然后 添加有效creator_id 例如:

u1 = User.new(first_name: "John", last_name: "Doe", email: "johndoe@example.com", password: "password", password_confirmation: "password", role_id: r1.id)
u1.save(false)
u1.update(creator_id: u1.id)

如果数据库中有 NOT NULL 约束...那么您只需要通过 SQL 完成所有这些操作,但首先要关闭 CONSTRAINT...