2013-10-03 99 views
1

我的項目有兩個實體ProjectsWords。 因此Project有許多WordsWord可用於多個Projects協會多對多

Words表應該只包含unique words,所以這意味着如果一個項目將增加,一個word這已經是在Words表,連接表中會針對project_id添加的word_id。或者如果這個詞不存在,它應該被添加到表中,關聯應該被添加到連接表中。

到目前爲止,我能夠加入到表中,並保存在Projects表並加入到Keyword表中的關鍵字name項目name

我不相信,如果我在解決這個問題的方法是好的,我也不知道如何處理has_and_belongs_to_many(我不需要一個has_many through協會,因爲我什麼都不做與模型在這一點上)。

+0

你應該打破你的許多一對多的關係分成兩個一對多的關係。 – tommyd456

+0

它在這裏解釋得很好:http://stackoverflow.com/questions/7339143/why-no-many-to-many-relationships – tommyd456

回答

3

首先,您應該儘可能使用has_many_through而不是has_and_belong_to_many。您可以使用find_or_create_by,以確保您只能創建關鍵字,在還未找到:

class Project < ActiveRecord::Base 
    has_many :project_keywords 
    has_many :keywords, :through => :project_keywords 

    def add_keyword(name) 
    keywords << Keyword.find_or_create_by(name: name) 
    end 
end 

class Keyword < ActiveRecord::Base 
    has_many :project_keywords 
    has_many :projects, :through => :project_keywords 

    validates :name, presence: true, uniqueness: true 
end 

class ProjectKeyword < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :keyword 
end 

現在,您可以輕鬆地添加使用輔助方法add_keyword關鍵字:

project = Project.create(name: 'My Project') 
project.add_keyword('foo') 
+0

這可能是一個愚蠢的問題,但如何填充連接表?而且由於在項目創建後會添加關鍵字,我是否需要add_keyword方法? – John

+0

@Alex Rails知道如何在通過has_many:y,通過:: x'設置關聯時填充連接表。當您使用給定的添加和刪除記錄的方法時,它會自動創建,更新和銷燬聯接記錄(請參閱[這裏](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#方法-I-的has_many))。 –