代码之家  ›  专栏  ›  技术社区  ›  Piccola

无法创建多对多关系

  •  0
  • Piccola  · 技术社区  · 7 年前

    我无法在RubyonRails中创建多对多关系。当我试图保存新词汇表时,总是会出错。

    “词汇表类别无效”

    这是我的代码:

    def create(glossary_params)
      Glossary.transaction do
           @glossary = Glossary.new(name: glossary_params[:name],
                       identifier: glossary_params[:identifier],
                       description: glossary_params[:description],
                       private_glossary: glossary_params[:private_glossary])
    
          glossary_params[:categories_id].each do |c|
             @glossary.glossary_categories.build(category: Category.find_by_id(c), user: @user)
         end
      end
      @glossary
    end
    

    这是我的词汇表模型:

    class Glossary < ApplicationRecord
      validates :name, presence: :true, uniqueness: { case_sensitive: false }
      validates :identifier, presence: :true, uniqueness: { case_sensitive: false }
    
      has_many :glossary_categories
      has_many :categories, through: :glossary_categories
    end
    

    这是我的分类模型:

    class Category < ApplicationRecord
       has_many :glossary_categories
       has_many :glossaries, through: :glossary_categories
    end
    

    这是我的GlossaryCategory模型:

    class GlossaryCategory < ApplicationRecord
       belongs_to :glossary
       belongs_to :category
       belongs_to :user
    end
    

    这是my glossary\u category表:

    create_table :glossary_categories do |t|
      t.belongs_to :glossary, index: true
      t.belongs_to :category, index: true
      t.integer :user_id
      t.timestamps
    end
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Piccola    7 年前

    我的create方法的解决方案是:

    def create(glossary_params)
       Glossary.transaction do
          @glossary = Glossary.create(name: glossary_params[:name],
                       identifier: glossary_params[:identifier],
                       description: glossary_params[:description],
                       private_glossary: glossary_params[:private_glossary])
    
          if @glossary.valid?
             if glossary_params[:categories_id].present?
                glossary_params[:categories_id].each do |c|
                    @glossary.glossary_categories.create(category: Category.find_by_id(c), user: @user)
                end
             end
          end
       end
       @glossary
    end