Rails活动记录来自HTTP帖子的多对多

时间:2014-06-23 08:27:06

标签: ruby-on-rails activerecord many-to-many

在rails 4中,我与数据库中的中间表有很多关系,并且每个模型中的has_and_belongs_to_many相互引用

这种关系看起来像这样......

标签> --- posts_tags ---<讯息

现在我有一个用户用来创建新帖子的html表单,他们所选标签的ID将作为名为tags []

的数组上传

我的问题是将所有这些posts_tags添加到数据库的最佳方法是什么?我意识到我可以通过标记ID来预先处理并使用Tag.find来检索这些模型,但这比将每个标记的post id和每个标记id插入post_tags列的单个插入查询要慢很多添加。我也更愿意采用积极的记录方式来保持简洁和干净。

2 个答案:

答案 0 :(得分: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 %>

答案 1 :(得分:1)

<强>集合

Rails具有一项特殊功能,允许您使用collection_ids填充associative collections。我找不到任何关于此的文件,但它就在那里,因为我们之前使用过它:

#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或其他任何东西 - 它只是工作

在此后端使用@Baloo的{​​{1}}元素应允许您填充select

-

<强>个人

如果您想单独添加这些项目,则需要在控制器中使用<< or .delete个方法:

post_tags
相关问题