Rails:同时创建模型和连接表,has_many到

时间:2015-12-26 23:26:16

标签: ruby-on-rails ruby activerecord associations

我有三个型号:

class Question < ActiveRecord::Base
  has_many :factor_questions
  has_many :bigfivefactors, through: :factor_questions

  accepts_nested_attributes_for :factor_questions
  accepts_nested_attributes_for :bigfivefactors
end

class Bigfivefactor < ActiveRecord::Base
  has_many :factor_questions
  has_many :questions, through: :factor_questions
end

和我的连接表,它不仅包含bigfivefactor_idquestion_id,还包含另一个整数列value

class FactorQuestion < ActiveRecord::Base
  belongs_to :bigfivefactor
  belongs_to :question
end

使用我的Question

创建新的_form.html.erb可以正常使用
<%= form_for(@question) do |f| %>
  <div class="field">
    <%= f.label :questiontext %><br>
    <%= f.text_field :questiontext %>
  </div>

<%= f.collection_check_boxes :bigfivefactor_ids, Bigfivefactor.all, :id, :name do |cb| %>
  <p><%= cb.check_box + cb.text %></p>
<% end %>

这让我来检查或取消选中尽可能多的bigfivefactors

但是,正如我之前提到的,连接模型也包含value

问题:

如何在每个复选框旁边添加文本字段以动态添加/编辑“值”?

For better understanding, i added an image

在控制台中,我基本上可以这样做:

q= Question.create(questiontext: "A new Question")
b5 = Bigfivefactor.create(name: "Neuroticism")
q.bigfivefactors << FactorQuestion.create(question: q, bigfivefactor: b5, value: 10)

我还发现要修改我的questions_controller

def new
  @question = Question.new
  @question.factor_questions.build
end

但我不知道如何将其纳入我的观点。

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

五大因素模型考虑因素

看起来你的Bigfivefactors不应该被修改每个更新问题。我实际上假设这些将是CMS控制的字段(这样管理员就可以定义它们)。如果是这种情况,请删除问题模型中bigfivefactors的accepts_nested_attributes。这将允许param注入将改变整个网站的行为。您希望能够链接到现有的bigfivefactors,因此@question.factor_questions.first.bigfivefactor.name是标签,@question.factor_questions.first.value是值。请注意,这些存在于不同的平面上。对象模型,所以我们可以在这里做很多魔术。

参数

为了传递您正在寻找的嵌套属性,参数需要如下所示:

params = { 
 question: { 
   questiontext: "What is the average air speed velocity of a sparrow?", 
   factor_questions_attributes: [ 
     { bigfivefactor_id: 1, value: 10 }, 
     { bigfivefactor_id: 2, value: 5  } ]
    } 
  }

一旦我们看到这样的参数,运行Question.create(params[:question])将创建问题和关联的@question.factor_questions。为了创建这样的参数,我们需要html表单复选框元素,其名称为&#34; question [factor_questions_attributes] [0] [bigfivefactor_id]&#34;值为&#34; 1&#34;,然后是一个名称为&#34;问题[factor_question_attributes] [0] [value]&#34;

的文本框

Api: nested_attributes_for has_many

视图

在这里,您需要使用fields_for通过辅助字段构建嵌套属性。

<%= f.fields_for :factor_questions do |factors| %>
  <%= factors.collection_check_boxes( :bigfivefactor_id, Bigfivefactor.all, :id, :name) do |cb| %>
    <p><%= cb.check_box + cb.text %><%= factors.text_field :value %></p>
  <% end %>
<% end %>

API: fields_for

我不确定视图中的所有内容是如何组合在一起的。您可能无法使用内置帮助程序。您可能需要创建自己的集合助手。 @question.factor_questions。像:

<%= f.fields_for :factor_questions do |factors| %>
  <%= factors.check_box :_destroy, {checked => factors.object.persisted?}, '0','1' %> # display all existing checked boxes in form
  <%= factors.label :_destroy, factors.object.bigfivefactor.name %>
  <%= factors.text_box :value %>
  <%= (Bigfivefactor.all - @question.bigfivefactors).each do |bff| %>
    <%= factors.check_box bff.id + bff.name %><%= factors.text_field :value %></p> # add check boxes that aren't currently checked
  <% end %>
<% end %>

老实说,我知道这不具备任何功能。我希望有关参数的见解有所帮助,但如果无法访问实际的rails控制台,我怀疑我是否可以创建完成您所需内容的代码。这是一个有用的链接:Site point does Complex nested queries