在rails 4中,我与数据库中的中间表有很多关系,并且每个模型中的has_and_belongs_to_many相互引用
这种关系看起来像这样......
标签> --- posts_tags ---<讯息
现在我有一个用户用来创建新帖子的html表单,他们所选标签的ID将作为名为tags []
的数组上传我的问题是将所有这些posts_tags添加到数据库的最佳方法是什么?我意识到我可以通过标记ID来预先处理并使用Tag.find来检索这些模型,但这比将每个标记的post id和每个标记id插入post_tags列的单个插入查询要慢很多添加。我也更愿意采用积极的记录方式来保持简洁和干净。
答案 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