0

我正在Rails中一個應用程序來顯示動畫,這些animes已經存在的對象有屬於多國語言,所以我做了一個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它只有西班牙語可用,那麼在表animes_languages我想創建值爲anime_id: 1language_id: 2的記錄,但我相信如果我執行命令Anime.find(1).languages.create它不會使用已經存在的語言,它會創建一種新的語言,但我唯一想做的就是將已經存在的動畫與現有的語言進行關聯,所以,我該怎麼做?我應該爲表格animes_language製作模型嗎?

這對我來說很讓人困惑,因爲當我按照這裏的指定創建表格時,我創建了沒有ID的表格,它只有字段anime_idlanguage_id

回答

1

之間創建連接記錄爲安全起見,我將它備份起來。

首先,您將您的表格遷移到一個或另一個引用(即,如果語言已經有很多動漫等),以移除已存在的關聯。

然後,您需要創建遷移以創建關聯的表。

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 
+0

尼斯,順便說一句,我怎麼能檢查,如果該關聯已經存在? – OiciTrap

+0

我很確定你不需要。如果它已經存在,那麼您只需創建一個引用某種語言'id'的新'Anime'。否則,該語言將包含除'id'之外的所有內容,並且將被創建。 – fbelanger

+0

我需要一些方法來知道ID爲'x'的動漫是否已與ID爲'y'的語言相關聯,或者我可以有多個記錄anime_id ='x'language_id ='y',只需測試它就可以發生。 – OiciTrap

0

應儘可能簡單

anime = Anime.find(1) 
language = Language.find(1) 
anime.languages << language 

這將在兩個