使用 Has And Belongs To Many 关联两个已经存在的对象

Associate two already existing objects using Has And Belongs To Many

我正在 Rails 制作一个应用程序来展示动漫,这些动漫拥有并属于多种语言,所以我建立了一个 HABTM 协会:

class Anime < ActiveRecord::Base
  has_and_belongs_to_many :languages
end

class Language < ActiveRecord::Base
  has_and_belongs_to_many :animes
end

现在我不知道如何在它们之间建立关联,我创建了许多语言的记录来使用它们,例如,ID 1 的语言是英语,ID 2 的语言是西班牙语等。 .. 我只想在动漫和语言之间建立联系,即,如果我想说 ID 为 1 的动漫只有西班牙语版本,那么在 table animes_languages I想创建值 anime_id: 1language_id: 2 的记录,仅此而已,但我相信如果我执行命令 Anime.find(1).languages.create 它不会使用已经存在的语言,它会创建一个新的语言,但我唯一想要的是在现有动画与现有语言之间建立关联,那么,我该怎么做?我应该为 table animes_language 制作模型吗?

这让我感到困惑,因为当我按照此处 enter link description here 创建 table 时,我创建了没有 ID 的 table,它只有字段 anime_idlanguage_id.

应该像

一样简单
anime = Anime.find(1)
language = Language.find(1)
anime.languages << language

这将在两者之间创建连接记录

为了安全起见,我会备份它。

首先,您迁移 tables 以删除与一个或另一个参考文献的现有关联(即,如果语言已经有很多动漫等)。

然后您需要创建迁移以创建 associative table.

rails g migration CreateJoinTableAnimeLanguage anime language

那么您模型中的关联指针应该可以正常工作。

class Anime < ActiveRecord::Base
  has_and_belongs_to_many :languages
end

class Language < ActiveRecord::Base
  has_and_belongs_to_many :animes
end

每当您想将一个与另一个已经存在的关联时:

Anime.find(1).languages << Language.find(1)

经验会建议不要尝试在单独的步骤中执行此操作。

我会说找到创建最多的东西,我猜 Anime,然后找到一种方法来选择或创建一种语言:

class AnimeController < ApplicationController
  def create
    @anime = Anime.new(anime_params)
    @success = @anime.save
  end

  private
    def anime_params
      params.require(:anime).permit(:stuff, :languages => [:id, :or_stuff])
    end
end