Ruby on rails Rails集合仅选择保存部分属性

Ruby on rails Rails集合仅选择保存部分属性,ruby-on-rails,Ruby On Rails,我试图理解如何做一件简单的事情-保存一个id和一个集合中的文本。 我刚刚开始与RoR合作,所以我还没有很好地掌握一切。 我主要有Java和一些Perl方面的经验,所以可能我没有选择正确的方法 我有一个缺陷,它有缺陷的根本原因。 还有另一个实体DefaultRootCause,我可以从中选择DefectRootCause.root\u与缺陷关联的原因。 我试图用缺陷的根本原因来挽救缺陷。DefectRootCause应该将根原因字段作为文本,这些值是从DefaultRootCause中选择的。 问

我试图理解如何做一件简单的事情-保存一个id和一个集合中的文本。 我刚刚开始与RoR合作,所以我还没有很好地掌握一切。 我主要有Java和一些Perl方面的经验,所以可能我没有选择正确的方法

我有一个缺陷,它有缺陷的根本原因。 还有另一个实体DefaultRootCause,我可以从中选择DefectRootCause.root\u与缺陷关联的原因。 我试图用缺陷的根本原因来挽救缺陷。DefectRootCause应该将根原因字段作为文本,这些值是从DefaultRootCause中选择的。 问题是我只需要为DefectRootCause保存一个根原因或默认根原因id。 此外,DefectRootCause.root_cause从DefaultRootCause获取id,而不是文本

请让我知道,我是否正确地尝试让一切神奇地发生,或者我是否应该在控制器中进行一些数据处理。 请参见下面的代码

我有以下模型:

class Defect < ActiveRecord::Base

  has_one :defect_root_cause, :dependent => :destroy
  has_many :default_root_cause, :through => :defect_root_cause

end

class DefectRootCause < ActiveRecord::Base
  belongs_to :defect
  belongs_to :default_root_cause

end

class DefaultRootCause < ActiveRecord::Base

  has_many :defect_root_causes
  has_many :defects, :through => :defect_root_causes
end
现在来看:

<%= form_for @defect do |f| %>
  <% if @defect.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@defect.errors.count, "error") %> prohibited this defect from being saved:</h2>

      <ul>
      <% @defect.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :details %><br>
    <%= f.text_field :details %>
    <%= f.fields_for @defect.defect_root_cause do |drc| %>
    <%= drc.label :root_cause%>
    <%= drc.collection_select(:default_root_cause_id, DefaultRootCause.all, :id, :root_cause, :prompt => true) %>

    <%= drc.label :details%>
    <%= drc.text_field :details %>
  <% end %>
  </div>
      <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
最后,我的问题根本原因是零:

irb(main):006:0> DefectRootCause.find(10)
  DefectRootCause Load (0.3ms)  SELECT  `defect_root_causes`.* FROM `defect_root_causes` WHERE `defect_root_causes`.`id` = 10 LIMIT 1
=> #<DefectRootCause id: 10, details: "sadsad", defect_id: 9, default_root_cause_id: 2, created_at: "2016-02-19 05:52:06", updated_at: "2016-02-19 05:52:06", root_cause: nil>
现在,请让我知道这是否是正确的方法

谢谢,,
Victor

您正试图通过父级更新关联的属性,这意味着您需要使用accepts\u nested\u attributes\u进行更新。将此方法添加到缺陷模型中,如下所示:

类缺陷 是否有一个:缺陷\u根本原因,:依赖=>:销毁 有多个:默认\u根本原因,:通过=>:缺陷\u根本原因

接受\u嵌套的\u属性\u用于:缺陷\u根本原因\u 结束

完成此操作后,转到defects_controller.rb并将Defection_params方法更新为:


参数require:defect.permit:details,defect\u root\u cause\u attributes:[:id,:details,:root\u cause,:default\u root\u cause\u id]

您可以使用以下代码:

<%=f.select :default_root_cause_id,  DefaultRootCause.all.collect{|r| [r.route_cause,"#{r.route_cause} - #{r.id}"]} %>

嗨,我以前试过用这个。。。不起作用。现在再试一次,仍然不起作用。我有.permit部分,但它不带defect\u root\u cause\u属性,因为我不知道为什么它们会作为defect\u root\u cause\u属性发送,而不是作为defect\u root\u cause\u属性发送…您好,当我尝试此操作时,会发送以下参数:参数:{utf8=>✓, 真实性\令牌=>Q4VOGRvnru4jP3oFtPTdPqEG8qsvzK9xAe/hbYWm+AQuAxt9hOk62xrcBzGaKiuGR7LB7HpTq8NFAcY373jiRg==,缺陷=>{details=>gigigi,缺陷\根本原因=>{default root\u cause\u id=>second root cause-2,details=>gigigigi},commit=>Create defect}。我得到以下错误:Mysql2::error:无法添加或更新子行:外键约束未能通过TestRailsAP\u开发。缺陷\u根本原因,约束fk\u rails\u 97daa073d4外键默认\u根本原因_id@Victors你能告诉我你的列default\u root\u cause\u idHi的数据类型是什么吗?我会稍后再做,因为我现在正在工作。在本例中,它尝试保存DefaultRootCause.default_root_cause_id=0而不是2,但该文件不存在。我可以在控制器中实现这一点-我从DefaultRootCause.RootCause中获取文本,基于发送给我的默认\u root\u cause\u id,但我不知道这是否是正确的方式。我有一个版本,其中保存了所有关系,但在控制器中完成了转换。我希望使用RoR的默认行为将所有内容都准备好。很抱歉,我这么晚才开始。t、 整数默认值\根\原因\ id,限制:4我认为这可以通过在控制器中执行某些操作来解决,我只是不知道这是否是正确的方法。将在我使其工作后发布使其工作的代码:。
irb(main):006:0> DefectRootCause.find(10)
  DefectRootCause Load (0.3ms)  SELECT  `defect_root_causes`.* FROM `defect_root_causes` WHERE `defect_root_causes`.`id` = 10 LIMIT 1
=> #<DefectRootCause id: 10, details: "sadsad", defect_id: 9, default_root_cause_id: 2, created_at: "2016-02-19 05:52:06", updated_at: "2016-02-19 05:52:06", root_cause: nil>
<%= drc.collection_select(:root_cause, DefaultRootCause.all, :id, :root_cause, :prompt => true) %>
irb(main):005:0> DefectRootCause.find(9)
  DefectRootCause Load (0.3ms)  SELECT  `defect_root_causes`.* FROM `defect_root_causes` WHERE `defect_root_causes`.`id` = 9 LIMIT 1
=> #<DefectRootCause id: 9, details: "das", defect_id: 8, default_root_cause_id: nil, created_at: "2016-02-19 05:42:36", updated_at: "2016-02-19 05:42:36", root_cause: "2">
<%= drc.select :default_root_cause_id, DefaultRootCause.all.collect{|r| [r.root_cause, r.id]}, :prompt => true %>

defects_controller.rb
def create
@defect = Defect.new(defect_params.except(:defect_root_cause))
@defect.defect_root_cause = DefectRootCause.create(defect_params[:defect_root_cause].merge(:root_cause => DefaultRootCause.find(defect_params[:defect_root_cause][:default_root_cause_id]).root_cause))
respond_to do |format|........
def update
respond_to do |format|
  if @defect.update(defect_params.except(:defect_root_cause)) && @defect.defect_root_cause.update(defect_params[:defect_root_cause].merge(:root_cause => DefaultRootCause.find(defect_params[:defect_root_cause][:default_root_cause_id])))
 Parameters: {"utf8"=>"✓", "authenticity_token"=>"jGUQIxeXWZwg5lqsPFrE4vO9z4ioRnAN/Z1/K9scQiIeQ0MTHBTvZoDcwHKtGvrgrG53y4yr7tX4wnCShoZ/oA==", "defect"=>{"details"=>"a", "defect_root_cause"=>{"default_root_cause_id"=>"2", "details"=>"a"}}, "commit"=>"Create Defect"}
  DefaultRootCause Load (0.1ms)  SELECT  `default_root_causes`.* FROM `default_root_causes` WHERE `default_root_causes`.`id` = 2 LIMIT 1
  CACHE (0.0ms)  SELECT  `default_root_causes`.* FROM `default_root_causes` WHERE `default_root_causes`.`id` = 2 LIMIT 1  [["id", "2"]]
  CACHE (0.0ms)  SELECT  `default_root_causes`.* FROM `default_root_causes` WHERE `default_root_causes`.`id` = 2 LIMIT 1  [["id", "2"]]
   (0.1ms)  BEGIN
   SQL (0.2ms)  INSERT INTO `defect_root_causes` (`details`, `default_root_cause_id`, **`root_cause`**, `created_at`, `updated_at`) VALUES ('a', 2, **'second root cause'**, '2016-02-23 07:10:59', '2016-02-23 07:10:59')
<%=f.select :default_root_cause_id,  DefaultRootCause.all.collect{|r| [r.route_cause,"#{r.route_cause} - #{r.id}"]} %>