2012-03-22 5 views
0

私は、タスクのモデルがあります:アソシエーション内部のレール部分の使い方は?

## Task 
has_many :children, :class_name => "Task" 
belongs_to :parent, :class_name => "Task", :foreign_key => "parent_id" 

を基本的にユーザーが多くのタスクがあり、各タスクは、多くの子タスクを持っています。

私は、ビュー内でこれをしなかった:

<%= render @tasks %> 

そしてそれは、データ構造が一次元だったときに正常に動作するために使用しました。

しかし、エラーメッセージ "(SQLite3 :: SQLException:そのような列:tasks.task_id:SELECT"タスク "。* FROM" tasks "WHERE" tasks "。" task_id "= 138)協会。私は "parent_id"を期待していました、それはモデルが参照することになっているからです。

これは、レールがローカル変数 "task"をそのクラス "task"に暗黙的に接続する方法が原因であると推測しています。例えば、私はそうのようにコメント内のフォームを構築したい:

## inside _task.html.erb 
<%= form_for task.children.build do |f| %> 
    <%= f.text_area :description %> 
<% end %> 

しかしtask.childrenは、それがなっていたときに、そのタスクは、コラム「TASK_ID」を持っていないというエラーを取得しますので、それは動作しません。 「parent_id」を参照してください。この問題を回避する方法はありますか?

FOREIGN_KEY

答えて

0

は、アソシエーションに使用する外部キーを指定します。 デフォルトでは、これは "_id"接尾辞を持つ関連付けの名前と推測されます。だから、belongs_to:personアソシエーションを定義するクラス は、デフォルト:foreign_keyとして "person_id"を使用します。同様に、 belongs_to:favorite_person、:class_name => "Person"は "foreign_person_id"の外部キーを使用します。

belongs_to :children, :class_name => "Task",:foreign_key => "parent_id" 

あなたはテーブル構造がわからないPK、イムを使用することもできます。

また、クリーンなデータのための一方向(1対多)であっても、多対多のテーブルを持つことができます。あなたが必要とするプロセスに依存します。

+0

回答がわかりません。あなたは、私が親と子として、belongs_toでお互いを指していて、has_manyがないという関係をモデル化すべきだと言っていますか?上で書いたように、私はすでにbelongs_to:parentアソシエーションにforeign_key => "parent_id"を持っています。また、なぜ私はこれをbelongs_to:has_many:childrenの代わりにchildrenというモデルとして提案しているのか分かりません。 – Vlad

0

あなたの関連付けを再構築する必要があります。

has_many :children, :class_name => "Task", :foreign_key => "parent_id" 
belongs_to :parent, :class_name => "Task" 

以下の質問は、Railsのドキュメントに間違いがあることを証明しているためです。質問下記ご参考をご覧ください

Ruby on Rails guides document on Activerecord association incorrect?

や団体がこの答えに使用されている方法を参照してください。

Rails Model has_many with multiple foreign_keys

関連する問題