2010-12-27 11 views
1

私はこの問題を解決するために努力してきましたが、実際に何が起こっているのか分かりません。で検索してください。含まれていないオブジェクトでエラーが発生しました。

DiscoveredLocation.find_by_user_id(user.id, :include => [:boss_kills]) 

モデルは以下のとおりです:

DiscoveredLocation(id, user_id, boss_location_id) 
BossKill(user_id, monster_id) 

や団体:私はこのコードの小片を持って

NoMethodError in BossesController#index 

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.each 

Monster belongs_to :boss_location 
Monster has_many :boss_kills 

BossKill belongs_to :user 
BossKill belongs_to :monster 


DiscoveredLocation belongs_to :user 
DiscoveredLocation belongs_to :boss_location 

DiscoveredLocation has_many :monsters, :through => :boss_location 

DiscoveredLocation has_many :boss_kills, :through => :monsters 

私はfind_byを実行し、私はこのエラーを取得します

私がincludを変更した場合他のどのモデルにもeオプションをつけることができます。私はこの問題によってかなり所有されています:P。多分誰かが私を助けることができますか?私は、あなたを助けるDiscoveredLocation.find_by_user_id(user.id, :include => [:boss_kill])

最後をしようとするが、間違っている可能性が

答えて

0

DiscoveredLocationモデルは、ネストされた定義しようとしているがあり、多くの団体を通じて:

DiscoveredLocation has_many :monsters, :through => :boss_location 
DiscoveredLocation has_many :boss_kills, :through => :monsters 

私はActiveRecordのは、箱から出して、これを行うことができると信じていません。これをサポートすると主張しているnested_has_many_throughプラグインがあります。この場合はうまくいくかどうかわかりません。

より多くの議論がherehere

+0

これは非常に興味深いですね。私は詳しく見ており、すぐに私の発見を報告します。 – Spyros

+0

ええと、プラグインをインストールしても、同じエラーが表示されます。 2番目の考えでは、レールはデフォルトでこの関連付けをサポートすべきだと私は考えます。 discover_locationには多くのboss_killsがあり、モンスターにはboss_killsが多く存在するため、discover_locationにはboss_killsからmonsterがあります。これは標準的な結合のように見えます。私はBossLocation Modelでも同じことをしており、うまくいきます。私はBossLocation> has_many:users、:through =>:discovered_locationsを持っています。それはどのように関係が設定されるかである可能性があります:/ – Spyros

+0

いいえ、私は 'has_many:through'のネストネストをサポートしていません。あなたは3つの関連付けを持っています: 'belongs_to:boss_location'、そして2つの' has_many:through'関連が連鎖しています。あなたのベスト・ベットIMOは 'boss_kills'関連で':finder_sql'オプションを使い、自分でクエリを書くことです。 – zetetic

0

:)、あなたはコントローラにユーザーという変数を渡していることを確認していますか?おそらくcurrent_user、あなたが人気のあるauth gemを使用しているのですか?

+0

この変更は見つかりませんでした協会という名前の「boss_kill」を与えを見つけたので、私はboss_killsがOKであると仮定することができます。また、yesのユーザは実際にはcurrent_userです:これは関数の中にあり、user.idが正しい(これはnilをチェックして使用しました:include =>:モンスターと他のインクルードは問題ありません)ので、 – Spyros

+0

それでは、ユーザーを通過している関数は何ですか。空白なので、表示されます。あるいは、あなたは作品を捏造している空白の記録を持っているかもしれません。奇妙なことが起きる。これが別の関数の中にある場合、関数全体を見たいと思います。ありがとう。 – pjammer

+0

ユーザーにとっては問題ありません。 (ユーザー) \t \t DiscoveredLocation.find_all_by_user_id \tデフself.getLocationNextBosses:しかしFYI、それは同様だ(user.id、:含ま=> [:boss_location、:モンスター]) であるとして、エンド とgetLocationNextBossesが呼ばれ\t current_userを引数として指定します。 – Spyros

0

あなたがそうでなければDiscoveredLocationsにboss_killsをマッピングする方法はありません、だけでなく、中間テーブルを含める必要があります。

DiscoveredLocation.find_by_user_id(user.id, :include => [:monsters, :boss_locations,:boss_kills]) 

また、生成されますクエリを確認するために開発ログをチェック。可能であれば、中間テーブルの1つが欠落しているかどうかを判断できるように、ここに投稿してください。

+0

同じエラーです。私は "has_many:boss_kills、:through =>:モンスター"がこのマッピングには十分だと思った。 – Spyros

+0

はあなたのデータモデルについての小さな誤解を持っていました - 答えを更新する、それを試してみてください。 – Roadmaster

+0

と同じです。私は実際に多くのモデルを試しました。私が削除したときのみ:boss_kills、それは他のモデルで動作します。 – Spyros

関連する問題