协会多对多

时间:2013-10-03 14:19:54

标签: ruby-on-rails associations ruby-on-rails-4

我的项目有两个实体ProjectsWords。 因此,Project有多个Words,而Word可用于多个Projects

Words表应该只包含unique words,这意味着项目是否会在连接表中添加word表中的Wordsword_id添加到project_id。或者,如果单词不存在,则应在表中添加关联,应将其添加到连接表中。

到目前为止,我可以添加到表中,项目name存储在Projects表中,关键字name添加到Keyword表中。

我不相信我解决这个问题的方法是否合适,我也不知道如何处理has_and_belongs_to_many(我不需要has_many through关联,因为此时我对模型没有做任何事情。)

1 个答案:

答案 0 :(得分: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')