4

Ruby on rails新手在這裏。試圖創建一個初學者博客應用程序,並且遇到與我的模型之間存在多對多關聯的問題。Rails 4多對多協會不工作

我有2個模型 - 發佈,類別之間有多對多的關聯。

我的問題:當我創建一個新帖子時,帖子被保存,但後類別關聯不會保存在categories_posts表中。

我的代碼如下。

我很欣賞你對此的意見。

post.rb

class Post < ActiveRecord::Base 
    validates_presence_of :title, :body, :publish_date 
    belongs_to :user 
    has_and_belongs_to_many :categories 
end 

category.rb

class Category < ActiveRecord::Base 
    validates_presence_of :name 
    has_and_belongs_to_many :posts 
end 

categories_posts.rb

class CategoriesPosts < ActiveRecord::Base 
end 

遷移 - create_posts.rb

class CreatePosts < ActiveRecord::Migration 
    def change 
    create_table :posts do |t| 
    t.string :title 
    t.text :body 
    t.date :publish_date 
    t.integer :user_id 

    t.timestamps 
    end 
    end 
end 

遷移 - create_categories.rb

class CreateCategories < ActiveRecord::Migration 
    def change 
    create_table :categories do |t| 
     t.string :name 
     t.timestamps 
    end 
    end 
end 

遷移 - create_categories_posts.rb

class CreateCategoriesPosts < ActiveRecord::Migration 
    def change 
    create_table :categories_posts do |t| 
     t.integer :category_id 
     t.integer :post_id 
     t.timestamps 
    end 
    end 
end 

柱控制器 - 創建和新方法

#GET /posts/new 
def new 
    @post = Post.new 
end 

def create 
    @post = Post.new(post_params) 

    #User id is not a form field and hence is not assigned in the view. It is assigned when control is transferred back here after Save is pressed 
    @post.user_id = current_user.id 

    respond_to do |format| 
    if @post.save 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
     format.json { render action: 'show', status: :created, location: @post } 
    else 
     format.html { render action: 'new' } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
    end 
    end 
end 

後視圖(用於創建新郵):

<%= simple_form_for @post, :html => { :class => 'form-horizontal' } do |f| %> 
    <%= f.input :title %> 
    <%= f.input :body %> 
    <%= f.input :publish_date %> 
    <%= f.association :categories, :as => :check_boxes %> 
    <div class="form-actions"> 
    <%= f.button :submit, :class => 'btn-primary' %> 
    <%= link_to t('.cancel', :default => t("helpers.links.cancel")), 
      posts_path, :class => 'btn' %> 
    </div> 
<% end %> 

謝謝, 邁克

+0

我也有同樣的問題,在這裏找到了解決辦法:https://開頭計算器。com/questions/11480939/many-to-many-many-many-through-association-form-with-data-assigned-to-linking-m?answertab = active#tab-top – Eltaf

回答

14

當使用has_and_belongs_to_many關聯中,你需要在你的連接表的唯一索引。遷移應該是這樣的:

class CreateCategoriesPosts < ActiveRecord::Migration 
    def change 
    create_table :categories_posts do |t| 
     t.integer :category_id 
     t.integer :post_id 
     t.timestamps 
    end 
    add_index :categories_posts, [:category_id, :post_id] 
    end 
end 

您也可以擺脫CategoriesPost模式,如果你想實現一個:has_many, :through協會,才需要。這應該回答你的問題。


而只是要徹底,如果你想用一個CategoriesPost模型:has_many, :through關聯中,你可以實現像這樣:

class Post < ActiveRecord::Base 
    has_many :categoriesposts 
    has_many :categories, :through => :categoriesposts 
end 
class Category < ActiveRecord::Base 
    has_many :categoriesposts 
    has_many :posts, :through => :categoriesposts 
end 
class CategoriesPost < ActiveRecord::Base 
    belongs_to :post 
    belongs_to :category 
end 

實現這個方法可以讓你把更多的屬性添加到您的如果你想的話

+0

我認爲他在做HABTM,沒有-many:通過。我認爲你應該改變你的答案,因爲它是正確的(他需要更新他的加入模式),但對於上下文可能會產生誤導 –

0

繼第一個答案,你需要把協會的加盟模式(CategoriesPosts)是這樣的:

Class CategoriesPosts < ActiveRecord::Base 
    belongs_to :category 
    belongs_to :post 
End 
+0

@裏克佩奇和安東尼去 感謝您的意見。 根據您的建議,更新後的帖子和類別模型要分別使用has_many:categories,:through =>:categoriesposts和has_many:posts,:through =>:categoriesposts。現在,當我嘗試創建新帖子時,出現「未初始化的常量Post :: Categoriespost」錯誤。 錯誤的截圖如下: http://imgur.com/a/BPD9k –