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 %>