gpt4 book ai didi

ruby - Rails 3- find_by 不工作

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:33 27 4
gpt4 key购买 nike

我有一个奇怪的问题。

我有两个模型用户和角色,它们之间存在多对多关系。我想在用户的角色集合中过滤名称为“管理员”的角色。

在模型中这段代码

puts self.roles.to_s

打印到屏幕: [角色 id:1,名称:“管理员”,created_at:“2012-01-22 21:55:45”,updated_at:“2012-01-22 21:55:45”]

但是这段代码

puts self.roles.find_by_name('Administrator').to_s

不打印任何东西。还有这个:

puts self.roles.find_by_name('Administrator').nil?

打印为真!

为什么我的 find_by_name 方法不起作用?我在控制台中尝试过它并且效果很好。

我的代码片段如下:

puts self.roles.to_s
puts self.roles.find_by_name('Administrator').to_s
puts self.roles.find_by_name('Administrator').nil?

输出如下:

[Role id: 1, name: "Administrator", created_at: "2012-01-22 21:55:45", updated_at: "2012-01-22 21:55:45"]
<none>
true

我做错了什么??它必须是愚蠢的。此代码位于验证方法中,因此在保存用户之前执行。

最佳答案

您提到您在保存模型之前的验证中执行此操作。这就是它失败的原因。由于 User 尚未保存,它在您的数据库中没有 id,因此它无法搜索您的关联。

第一行 (self.roles.to_s) 起作用的原因是 Rails 会记住您添加到用户的任何角色,但在您保存用户之前不会将它们保存到数据库中。一旦你保存了用户,你的第二/第三行就可以正常工作了:

user = User.new
user.roles << Role.first
user.roles
# => [#<Role id: 1, name: "Administrator" ...>]
user.roles.find_by_name("Administrator")
# => nil
user.save # This inserts both the new user AND the associations
user.roles.find_by_name("Administrator")
# => #<Role id: 1, name: "Administrator" ...>

如果您必须在验证中使用它,您可以尝试使用 Enumerable 的 find 方法来搜索 roles 数组:

user = User.new
user.roles << Role.first
user.roles
# => [#<Role id: 1, name: "Administrator" ...>]
user.roles.find { |role| role.name == "Administrator" }
# => #<Role id: 1, name: "Administrator" ...>
user.roles.find { |role| role.name == "Foo" }
# => nil

关于ruby - Rails 3- find_by 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8977985/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com