Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails——如何属于许多人?_Ruby On Rails - Fatal编程技术网

Ruby on rails RubyonRails——如何属于许多人?

Ruby on rails RubyonRails——如何属于许多人?,ruby-on-rails,Ruby On Rails,我有一个名为Report,另一个名为Phases。假设我有10个阶段,我希望在报告表单上有复选框,列出所有阶段。如何收集已检查的项目并将该数据存储在数据库中 我是否需要像phase\u one:integerphase\u two:integerphase\u two:integer这样的列,并且只需将非空的列拉回来?或者我可以将x相位的ID存储在一列中,然后将这些ID提取到一个数组中吗?听起来您可能想要的是一个多对多关系,或者一个具有并且属于多个。为此,您需要在报表和流程之间创建一个联接表,该

我有一个名为
Report
,另一个名为
Phases
。假设我有10个
阶段
,我希望在报告表单上有复选框,列出所有
阶段
。如何收集已检查的项目并将该数据存储在数据库中


我是否需要像
phase\u one:integer
phase\u two:integer
phase\u two:integer
这样的列,并且只需将非空的列拉回来?或者我可以将x相位的ID存储在一列中,然后将这些ID提取到一个数组中吗?

听起来您可能想要的是一个多对多关系,或者一个
具有并且属于多个
。为此,您需要在报表和流程之间创建一个联接表,该联接表将有一个
Report\u id
列和一个
phase\u id
。有关更多信息,请参阅本文档:

在模型中,您需要添加:

Class Report < ActiveRecord::Base

  has_and_belongs_to_many :phases

  ...
end
类报告

类阶段
为了澄清
NateShared
的答案,如果预定义了
阶段,则可以使用:

#app/models/report.rb
class Report < ActiveRecord::Base
   has_and_belongs_to_many :phases
end

#app/models/phase.rb
class Phase < ActiveRecord::Base
   has_and_belongs_to_many :reports
end
这将允许您指定报告具有哪些阶段,尽管它不会有任何更改


我认为您最好使用,允许您定义引用的
阶段

#app/models/report.rb
class Report < ActiveRecord::Base
   has_many :progress
   has_many :phases, through: :progress

   accepts_nested_attributes_for :progress #-> define level
end

#app/models/progress.rb
class Progress < ActiveRecord::Base
   #id report_id phase_id phase_lvl created_at updated_at
   belongs_to :report
   belongs_to :phase
end

#app/models/phase.rb
class Phase < ActiveRecord::Base
   has_many :progress
   has_many :reports, through: :progress
end
这将使您能够定义以下内容:

#app/views/reports/new.html.erb
<%= form_for @report do |f| %>
   <%= f.fields_for :progress do |p| %>
      <%= p.collection_select :phase_id, @phases, :id, :name %>
      <%= p.number_field :phase_lvl %>
   <% end %>
   <%= f.submit %>
<% end %>
#app/views/reports/new.html.erb

这意味着我必须创建重复的阶段,因为每个报告将有一个阶段?阶段表中不能有10个阶段,而每个报告只属于一个或多个阶段?不,通过这种方式,您可以创建10个阶段,然后在报告和阶段之间进行多对多映射。您不需要创建phaseshmm ok Interest报告的副本。最后,如果有20个阶段,报告如何与阶段关联?是否有数组或其他内容存储在报告的“阶段id”列中?谢谢你的推荐。现在我要去看看,在协会的例子中,它似乎和我的情况有点不同。例如,如果部件有两个零件,则必须使用相应零件的零件id创建两个部件条目。我想创建“一个”报告,并有“多个”阶段。不确定这是否仍然适用。那么听起来你想要一个有很多并且属于关系的人。每个阶段都有一个指向报告的id,这就是您跟踪它们的方式。感谢您的解释。我真的很感激。因此,我的报告不一定有层次,但将阶段视为“部分”是有意义的。因此,在预定义的部分列表中,报告只有3个部分。如果这有意义的话。哈哈,基本上我有几个阶段,比如“内部”和“外部”,每个报告都有一个或多个阶段。我想说report.phases,然后它返回报告的阶段。我不想为每个报告创建一个新的“内部”阶段。这和你的例子有什么相似之处吗?我可能完全糊涂了。不管怎样,非常感谢您的帮助和反馈!这很好,除了
report\u params
方法应该是
params.require(:report.permit({phase\u id:[]})
#app/models/report.rb
class Report < ActiveRecord::Base
   has_many :progress
   has_many :phases, through: :progress

   accepts_nested_attributes_for :progress #-> define level
end

#app/models/progress.rb
class Progress < ActiveRecord::Base
   #id report_id phase_id phase_lvl created_at updated_at
   belongs_to :report
   belongs_to :phase
end

#app/models/phase.rb
class Phase < ActiveRecord::Base
   has_many :progress
   has_many :reports, through: :progress
end
#app/controllers/reports_controller.rb
class ReportsController < ApplicationController
   def new
      @report = Report.new
      @phases = Phase.all
      10.times do 
         @report.progress.build
      end
   end

   def create
      @report = Report.new report_params
      @report.save
   end

   private

   def report_params
      params.require(:report).permit(progress_attributes: [:phase_id, :phase_lvl])
   end
end
#app/views/reports/new.html.erb
<%= form_for @report do |f| %>
   <%= f.fields_for :progress do |p| %>
      <%= p.collection_select :phase_id, @phases, :id, :name %>
      <%= p.number_field :phase_lvl %>
   <% end %>
   <%= f.submit %>
<% end %>