Rails多对多多态创建多个

时间:2013-10-01 13:48:32

标签: ruby-on-rails forms polymorphic-associations

所以我为我的问题模型创建了一个Category模型。我还为多态关系创建了一个Tag模型,这样一个问题可以有很多类别,一个类别可以有很多问题。

我在完成创建问题和选择类别的过程时遇到问题,同时也保存了与问题相关联的类别。提交表单和创建标签之间似乎缺少联系。

以下是我的模特:

question.rb

class Question < ActiveRecord::Base

has_many :tags, :as => :taggable, :dependent => :destroy
has_many :categories, :through => :tags

end

tag.rb

class Tag < ActiveRecord::Base

  belongs_to :taggable, :polymorphic => true
  belongs_to :category

end

Category.rb

class Category < ActiveRecord::Base

has_many :tags, :dependent => :destroy
has_many :questions, :through => :tags, :source => :taggable, :source_type => 'Question'

end

问题表单

<%= f.input :question, input_html: { class: 'form-control' }%>
</div>

<div class="form-group">
<%= f.input :category_ids, collection: Category.all, :input_html => {multiple: true, class: 'form-control' } %>
</div>

<%= f.fields_for :choices do |b| %>
<div class="form-group">
<%= b.input :choice, input_html: { class: 'form-control' } %>

 </div>

<% end %>
     

<%= f.button :submit, :class => "btn btn-primary"%>

问题控制器创建操作

  

def创建       @question = current_user.questions.new(question_params)

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

提交表单时,类别ID的提交方式如下:“category_ids”=&gt; [“”,“2”,“3”]

我觉得缺少的链接是创建一个像这样的方法

def create_tag (category_id, question_id)
    t = Tag.new
    t.taggable = Question.find(question_id)
    t.category = Category.find(category_id)
    t.save

end

但我不确定在哪里最好放置这个或如何在创建动作中连接它并成功创建正确的关联。

此方法也只会创建一个类别,因此我需要循环使用类别ID来创建多个类别。

由于

1 个答案:

答案 0 :(得分:0)

你能试试这段代码吗?

def create
  @question = current_user.questions.new(question_params)
  if @question.save
    params[:question][:category_ids].select{ |x| x.present? }.each do |category_id|
      tag = Tag.new(taggable: @question, category_id: category_id)
      if tag.save
      else
        something_went_wrong = tag
      end
    end
  else
    something_went_wrong = @question
  end
  respond_to do |format|
    if something_went_wrong.blank?
      format.html { redirect_to @question, notice: 'Question was successfully created.' }
      format.json { render action: 'show', status: :created, location: @question }
    else
      format.html { render action: 'new' }
      format.json { render json: something_went_wrong.errors, status: :unprocessable_entity }
    end
  end
end

使用此代码的内容是:

  • 创建的每个标记只是问题与解答之间的链接。类别,标签没有实际名称。
  • 即使一个标签未通过验证(如唯一性约束),也会创建其他有效标签,但仍会显示错误。您可能想要在创建之前检查所有标签是否有效。