【问题标题】:Rails 3- find_by not workingRails 3-find_by 不工作
【发布时间】:2012-01-23 20:16:51
【问题描述】:

我有一个奇怪的问题。

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

在模型中这段代码

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 方法不起作用? 我在控制台中尝试了它,它运行良好。

我的代码 sn-p 如下:

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

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

【问题讨论】:

  • 两个表中都有名称列吗?
  • 调用find_by_name时数据库中的新角色吗?
  • 你能发布你的 habtm 配置吗?

标签: ruby ruby-on-rails-3 activerecord findby


【解决方案1】:

您提到您在保存模型之前进行验证。这就是它失败的原因。由于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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    相关资源
    最近更新 更多