2012-01-02 109 views
4

嗨,我是新來的鐵軌,並開始了一個簡單的應用程序,它有許多'任務',每個人都有一個'標記'附加它。所以這種關係就像 - 許多「任務」都有一個/相同的「標籤」。我如何在模型中提出這個問題。我試着用'task'has_one'tag'和一個'tag'belongs_to'task'規則,但它僅適用於帶有該標籤的第一個'task'和其餘具有相同'tag'的'tasks'它不會工作。請建議我正確地做到這一點。謝謝:)Rails多對一協會

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

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

你可以把你的任務和標籤的屬性的一些信息? – jay 2012-01-02 04:00:28

回答

9

它看起來像你對我有關聯轉頭 - 每一個新手,我見過做這個on Rails的自己第一個項目。

你想要的是

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

class Tag < ActiveRecord::Base 
    has_many :tasks 
end 

想想這種方式 - 如果你點擊一個標籤,你會期望的是有標籤的所有任務列表。所以標籤有很多任務,每個任務都屬於一個標籤。這符合你描述你的項目的方式。 Has_one用於一對一的關係,每個任務都有自己的唯一標籤。

+0

它的工作感謝;) – sarath 2012-01-02 06:51:57

+0

感謝您的解釋! – schlenger 2015-01-21 16:40:34

2

您的問題可能是,使用外鍵「ID」意味着你正在使用的標籤表「IDS」列作爲你的鑰匙,這是不合邏輯的。在這種情況下,ID爲1的任務認爲它將與ID爲1的標籤相關聯。

如果使用RAILs約定設置您的遷移,我會假設您在標記表中有一列,用於記錄TASK_ID。在這種情況下,我認爲你將只需要這些協會:

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

class Tag < ActiveRecord::Base 
    belongs_to :task 
end 

同樣,這會假設你有一個標籤叫「TASK_ID」的屬性。如果你在一個非常規的關鍵如保存爲「custom_name_task_id」再變成

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

沒有周杰倫,任務表記錄它應該有的標籤。你的是另一種方式。 – sarath 2012-01-02 06:50:42

+0

哦,好的。我對你的解釋感到困惑。無論如何,kimhagen理解並且一切順利,因爲他的回答是正確的。 – jay 2012-01-02 17:16:58

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寶石,這一切都爲你。