2012-01-23 18 views
0

私は奇妙な問題があります。Rails 3- find_by not working

私は2つのモデルを持っています。それらの間に多対多の関係を持つユーザーとロールがあります。 ユーザーのロールコレクション内で、名前が「Administrator」のロールをフィルタリングしたいとします。モデルで

このコード画面に

puts self.roles.to_s 

プリント: [ロールID:1、名称: "管理者" のcreated_at: "2012年1月22日午前21時55分45秒"、updated_atの: "2012年1月22日二十一時55分45秒"]

しかし、このコード

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

は何も印刷されません。この1つ:

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

prints true!

私の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がユーザーに追加するロールはすべて記憶されますが、ユーザーを保存するまでデータベースには保存されません。ユーザーを保存すると、あなたの第三/第2の配線が正常に動作します:

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" ...> 

あなたが検証にこのと仕事をしなければならない場合は、代わりにroles配列を検索するために、列挙のfindメソッドを使用してみてください:

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