创建或保存多对多关系

时间:2014-09-17 00:10:25

标签: ruby-on-rails-3.2 ruby-1.9.3

我创建了一个本地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

1 个答案:

答案 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