1

我的项目有两个实体ProjectsWords. 所以 aProject有很多Words,而 aWord可以在多个中使用Projects

Words表应该只包含unique words,这意味着如果一个项目将添加,一个word已经在Words表中的,在连接表中将被添加word_idproject_id. 或者如果该词不存在,则应将其添加到关联表中,应将其添加到连接表中。

到目前为止,我能够添加到表中,一个name存储到表中的项目和一个添加到表Projects中的关键字。nameKeyword

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

4

1 回答 1

3

首先,您绝对应该尽可能使用has_many_throughover 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')
于 2013-10-03T14:29:02.407 回答