2012-01-02 17 views
4

こんにちは私はレールが初めてで、多くの「タスク」を持ち、それぞれに「タグ」が付いているシンプルなアプリから始めました。関係は同じです - 多くの「タスク」は1つの同じタグを持っています。これを私のモデルにどのように持ち込むのですか?私は 'タスク' has_one 'タグ'と 'タグ' belongs_to 'タスク'ルールを試してみましたが、それはそのタグを持つ最初の 'タスク'と同じ 'タグ'を持つ残りの 'タスク'それは動作しません。これを適切に行う方法を教えてください。感謝:)Rails Many to Oneアソシエーション

class Task < ActiveRecord::Base 
    has_many :logs 
    has_one :tag , :foreign_key => "id" 
end 

class Tag < ActiveRecord::Base 
    belongs_to :task 
end 
+0

タスクやタグの属性に関する情報を入力できますか? – jay

答えて

9

に変更します「custom_name_task_id」最初のプロジェクト。何をしたい

class Task < ActiveRecord::Base 
    has_many :logs 
    belongs_to :tag 
end 

class Tag < ActiveRecord::Base 
    has_many :tasks 
end 

はそれについてこのように考えている - あなたがタグをクリックすると、あなたはそのタグを持っているすべてのタスクのリストを期待します。したがって、タグには多くのタスクがあり、各タスクは1つのタグに属します。これはあなたのプロジェクトの記述方法と一致します。 Has_oneは1対1の関係を意図しており、各タスクは固有の固有のタグを持ちます。

+0

ありがとう;) – sarath

+0

ありがとうございました! – schlenger

2

あなたの問題は、外部キー「ID」を使用すると、あなたは非論理的であるあなたの鍵、などのタグテーブル「IDS」列を使用していることを意味する可能性があります。この場合、id 1のタスクはID 1のタグに関連付けられていると考えます。

RAILの規則を使用して移行を設定した場合、タグテーブルには、 TASK_ID ..この場合、私はあなただけのこれらの関連付けを必要とするだろうと思う:

class Task < ActiveRecord::Base 
    has_many :logs 
    has_one :tag 
end 

class Tag < ActiveRecord::Base 
    belongs_to :task 
end 

繰り返しますが、これはあなたが「TASK_ID」と呼ばれるタグの属性を持っていると仮定します。私が今まで見た中でのRailsのすべての初心者が自分でこれを行っている - あなたは型破りキーなどでそれを保存した場合、それはあなたが団体が振り向いているようそれは私には見えます

class Task < ActiveRecord::Base 
    has_many :logs 
    has_one :tag, :foreign_key => "custom_name_task_id" 
end 

class Tag < ActiveRecord::Base 
    belongs_to :task 
end 
+0

いいえJay、tasksテーブルには必要なタグが記録されます。あなたのものは逆です。 – sarath

+0

よろしいですか?私はあなたの説明に混乱しました。いずれにせよ、キンハーゲンは理解して、すべてがうまくいっています。彼の答えは正しいです。 – jay

1

あなたが正しく理解していれば、タスクは1つのタグしか持たず、そのタグは複数のタスクに属することができます。タスクにbelongs_to :tag、タグにhas_many :tasksが必要です。

しかし、私はあなたがおそらく最終的には、単一のタスクのために複数のタグをしたいと思う、と私はそれはそうと同じように、MMの関係を行うには、最初からより良いと思うだろう:

class Task < ActiveRecord::Base 
    has_many :tagged_tasks 
    has_many :tags, through: :tagged_tasks 
end 

class Tag < ActiveRecord::Base 
    has_many :tagged_tasks 
    has_many :tasks, through: :tagged_tasks 
end 

class TaggedTask < ActiveRecord::Base 
    belongs_to :task 
    belongs_to :tag 
end 

これは、あなたが可能にタスク用の複数のタグを持つことができますが、おそらくacts_as_taggable_onという宝石を使ってください。