2016-09-06 73 views
1

我正在編寫一個CMS插件,其中我有兩個基本模型 - CategoryEntry。這個模型中的每一個都與另一個通過has_and_belongs_to_many關係有關。但我無法弄清楚,我應該如何在他們的控制器和路線中指出這一點。例如,我需要在categories#show操作中呈現屬於某個類別的所有條目。 下面是型號:找不出兩個模型之間的關係

class Entry < ApplicationRecord 
    has_and_belongs_to_many :categories 
end 

class Category < ApplicationRecord 
    has_and_belongs_to_many :entries 
end 

這是我categories_controller

def show 
    @category = Category.find(params[:id]) 
    @entries = @category.entries.all 
end 

和我show.html.erb模板中:

<% @entries.each do |entry| %> 
    <%= link_to entry.title, entry_path(entry) %> 
<% end %> 

和我的路線:

resources :categories do 
    scope '/:content_class' do 
    resources :entries 
    end 
end 

但是,每次出現錯誤時,數據庫中都沒有categories_entries關係。我究竟做錯了什麼?

這裏是一個link to the whole project

+0

您是否已經遷移了數據庫? –

+0

我使用STI,一旦我的插件安裝完畢,就不需要進一步遷移 – AlexNikolaev94

+0

爲什麼你有兩個表格的兩個模型呢? –

回答

1

我看着你提供GitHub的倉庫後,我認爲你需要有一個交叉引用表,使協會工作。

其原因在於應該有一種方法來區分一個表的哪些記錄與另一個表的哪個記錄有連接。在one-to-many關係如has_onebelongs_to的情況下,可以通過在另一個模型的表中記錄其中一個模型的id來實現。由於您需要在兩個表中的每個記錄中記錄多個id,因此只能使用單獨的表格。

試着做這樣的表只有兩個字段:category_identry_id,類似於這個片段遷移:

class CreateCategoryEntryJoinTable < ActiveRecord::Migration 
    def change 
    create_table :categories_entries, id: false do |t| 
     t.integer :category_id 
     t.integer :entry_id 
    end 
    end 
end 

你可以閱讀更多來自這裏:http://apidock.com/rails/v4.2.1/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many

+0

我完全按照你所說的完成了,但仍然有同樣的錯誤:(可能是我做錯了在我的控制器中? – AlexNikolaev94

+0

@ AlexNikolaev94檢查表中的表名和字段是否正確如果他們是你執行遷移嗎?我沒有看到你的控制器的問題和消息並不意味着什麼,但這張桌子的缺席... –

0

一個has_and_belongs_to_many關聯需要您尚未創建的連接表。請參閱this guide瞭解更多信息。

相關問題