2012-01-23 52 views
0

我有一个奇怪的问题。Rails 3- find_by不工作

我有两个模型用户和他们之间有多对多关系的角色。 我想在用户的角色集合中过滤名称为'Administrator'的角色。

在模型验证码

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 

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

+1

你是否在两个表中都有一个名称列? – jstim

+0

当你调用'find_by_name'时,数据库中的新角色是什么? –

+0

对这两个问题都可以 – Tony

回答

3

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

第一行工作原因(​​)是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" ...> 

如果你在你验证这个工作,你可以尝试使用可枚举的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 
+0

谢谢迪伦。 – Tony