我创建了一个本地RoR应用程序来帮助预测前端html内容,存储它,组织它,然后将它放入另一个数据库中。我目前正在开始组织和将此内容导入另一个数据库。除了我需要能够保存(或更新,如果存在)Post对象与term_taxonomy的多对多关系之外,这一直进展顺利。
以下代码(在控制器中):
def create_hierarchy post, content
[...]
@crumbs.each do |crumb|
@term_attributes = {
:name => crumb.strip,
:slug => crumb.parameterize.split(' ').join('-').downcase
}
@term = Term.where(@term_attributes).first_or_initialize
@term_taxonomy = TermTaxonomy.where({:term_id => @term.id, :taxonomy => 'category'}).first_or_initialize
@term_taxonomy.posts << post
@term.term_taxonomies << @term_taxonomy
@term.save!
end
[...]
end
代码@term_taxonomy.posts << post
导致错误:Mysql2::Error: Duplicate entry ...
当我第一次之后运行它时。第一次运行时,Term_taxonomy和Post之间的多对多关系成功保存,没有问题。
对于与term_taxonomy的多对多关系,执行保存(或更新,如果存在帖子关系)的更好方法是什么?
更新 -
以下是我导入的数据库的关系:
class Post < ActiveRecord::Base
[...]
has_many :term_relationships, :foreign_key => 'object_id', autosave: true
has_many :term_taxonomies, :through => :term_relationships
end
class TermRelationship < ActiveRecord::Base
[...]
belongs_to :post, :foreign_key => "object_id"
belongs_to :term_taxonomy
has_one :term, :through => :term_taxonomy
end
class TermTaxonomy < ActiveRecord::Base
[...]
belongs_to :term, autosave: true
has_many :term_relationships, :foreign_key => 'term_taxonomy_id'
has_many :posts, :through => :term_relationships
end
class Term < ActiveRecord::Base
[...]
has_many :term_taxonomies, foreign_key: 'term_id'
end
答案 0 :(得分:0)
我已经弄明白了。
这就是我将控制器改为:
def create_hierarchy post, content
[...]
@term_attributes = {
:name => category_name.strip,
:slug => @slug_builder += (@slug_builder.present? ? '-' : '') + slugify(category_name)
}
@term = Term.where(@term_attributes).first_or_create!
@term_taxonomy_attributes = {
:term_id => @term.id,
:taxonomy => 'category'
}
@term_taxonomy = @term.term_taxonomies.where(@term_taxonomy_attributes).first_or_create!
[...]
# Add or update post
if @term_taxonomy.posts.exists? post
@term_taxonomy.posts.find(post.ID).update_attributes(post.attributes)
else
@term_taxonomy.posts << post
end
@term.save!
@term_taxonomy.save!
end