我有一个关于发生在我身上的奇怪事情的问题。
我有一个rails应用程序,我预先填充了一些预先定义的用户,我运行命令rake db:seed
并创建这些用户,我检查rails c
并在那里运行User.all
他们是。我运行User.find(1)
它会返回一个用户。好的,没问题。
但是,当我启动应用程序时,我在user.rb
中有一个代码
User.find(1) # I know that this user will have a fixed id throughout every environment
但......它没有找到,我得到ActiveRecord::RecordNotFound
例外。
我的目标是在数据库中创建新用户后,从User.find(1)
接收欢迎消息。它是否与ActiveRecord回调中的事实相关,after_commit
编辑:
我的代码很简单,在创建新用户后,它会收到来自用户where(email: "theemail").first
的消息
所以我的user.rb模型有以下片段:
after_commit :send_welcome_message
def send_welcome_message
welcome_user = User.where(email: "xyz").first
Conversation.send_welcome_message(self, welcome_user)
end
我在send_welcome_message
中放置了一个调试器User.all.size
并返回1.我使用了rails控制台,同样的查询返回了5.
答案 0 :(得分:1)
因此找不到ID为1的用户。这并不意味着您无法访问种子创建的用途。删除所有用户时,ID号不一定会重置为1。
即。如果删除用户1,则您创建的下一个用户仍将具有ID 2
解决方案可能是使用一些不同的方法来查找用户。即您可以在种子中为它们设置一个特殊的name
,然后使用该名称查找它们。
答案 1 :(得分:0)
如果您创建了三个用户,然后将其全部删除,则您的第四个用户的ID值为4.您可以通过在拨打User.all
时检查用户的ID来验证这一点
正如上面提到的@maxpleiner,也许有可能通过他们的名字来查找它们。 after commit块可能会阻止您在应用程序周围传递该用户,因为它会单独调用自身。如Rails: Can you pass arguments to the after_create method?中所述,您无法将记录传递给后创建。您可以做的是添加一些自定义代码,在您创建将处理您的用例的用户后立即放置该代码。