我的项目有两个实体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 :(得分: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')