2014-06-23 31 views
0

在軌道4我有一個多對多的關係與數據庫中的一箇中間表和has_and_belongs_to_many每個模型稱呼對方Rails的活動記錄多對多從HTTP POST

的關係看起來像這樣...

標籤> --- posts_tags --- <帖子

現在我有一個用戶使用,以創建一個新的崗位和自己選擇的標籤的ID是越來越上傳爲數組命名的標記HTML表單[]

我的問題是將所有這些posts_tags添加到數據庫的最佳方式是什麼?我意識到我可以通過標籤ID進行foreach並使用Tag.find來檢索這些模型,但這比單個插入查詢慢得多,該插入查詢將每個標籤添加後的帖子ID和每個標籤ID插入到post_tags列中。我也希望這樣做是積極的記錄方式,以保持簡潔和乾淨。

回答

1

收集

Rails有一塊特殊的功能,它允許您使用collection_ids填充associative collections。我無法找到任何這documenation,但它的存在,因爲我們之前已經使用過它:

#app/controllers/posts_controller.rb 
class PostsController < ApplicationController 
    def create 
     @post = Post.new post_params 
     @post.save 
    end 

    private 

    def post_params 
     params.require(:post).permit(:tag_ids) 
    end 
end 

這意味着如果你傳遞任何值到tag_ids屬性,Rails會保存集合爲您服務。你並不需要做accepts_nested_attributes_for或任何東西 - 它只是工作

通過使用@Balooselect元素這個後端應允許您填充post_tags

-

個人

如果您想單獨添加這些項目,您需要在控制器中使用<< or .delete方法:

#app/controllers/posts_controller.rb 
Class PostsController < ApplicationController 
    def change_tag 
     @post = Post.find params[:id] 
     @tag = Tag.find params[:tag_id] 

     @post.tags << @tag if request.post? 
     @post.tags.delete(@tag) if request.delete? 
    end 
end 
+0

[Documentation](http://guides.rubyonrails.org/association_basics.html#methods-added-by-has-many-collection-singular-ids)is in導軌指南 –

1

該協會本身會給你你可以使用的方法。在你的關聯中,一個帖子將有一個tag_ids方法,你可以給一個標籤ID數組。這意味着你可以這樣做:

<%= form_for @post do |f| %> 
    <div class="field"> 
    <%= f.label :tag_ids %><br /> 
    <%= f.select :tag_ids, Tag.order(:name).pluck(:name, :id), {}, :multiple => true, :size => 6 %> 
    </div> 
<% end %> 
+0

我已經在創建表單中顯示了所有標籤。我的問題是,如何在用戶點擊提交時有效地將關聯添加到數據庫。我不確定你是否看過我的問題。 –

+0

這是正確的方法 - 我會爲你解釋 –