2013-10-03 3 views
1

Мой проект имеет два образования Projects и Words. Так Project имеет много Words и Word может использоваться в нескольких Projects.Ассоциация много-ко многим

В таблице Words должен содержать только unique words, так это означает, что если проект будет добавить, а word, который уже в Words таблице, в соединительной таблице будет добавлена ​​word_id против project_id. Или, если слово не существует, оно должно быть добавлено в таблицу в ассоциации, которое должно быть добавлено в таблицу соединений.

До сих пор я могу добавить в таблицы, проект name, который хранится в таблице Projects и ключевое слово name, который добавляется в Keyword таблице.

Я не уверен, что мой подход в решении этой проблемы хорош, также я не знаю, как иметь дело с 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, through:: x'. Он будет автоматически создавать, обновлять и уничтожать записи объединений для вас, когда вы используете данные методы добавления и удаления записей (см. Их [здесь] (http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html# метод-я-hAS_MANY)). –

Смежные вопросы