我的问题导轨的has_many,:通过 - 更新创建相关联的对象时连接表列
如何设置初始“job_position”(在checklists_jobs列连接表这个has_may,:通过协会)的检查清单创建时新的检查清单的工作?我最好的猜测是我应该使用回调(checklist控制器中的after_filter?)。
我也需要应用这种相同的方法来更新控制器的行动,但我怀疑代码将几乎相同。
使用情况
我在一个单一的形式创建清单和相关的作业(任务)。从这个表格中,用户可以创建一个新的清单(名称,描述),并创建新的作业(名称,描述)和/或从一个选取列表中选择现有作业。
实际的形式是我的“代码”部分的下方,但这里是一个什么样创建一个新的清单时,用户将看到一个摘要:
- 清单名称:
- 清单说明(可选):
(“添加新任务”链接) - 如果点击链接,我用JS到一个新的工作(空白)追加到形式:
- 项目名称:
- 职位描述(可选):
- (复选框)现有工作1
- (复选框)现有工作2
从工作组加入职位
CREATE CHECKLIST(button)
On my joe在表(checklists_jobs)中,我有必要的checklist_id和job_id字段,但我也有一个“job_position”字段,它告诉我该清单上作业的显示顺序。 (我将主要通过以下Checklist.rb代码所示的“unarchived_jobs”联想做到这一点。)
如何它现在的工作,现在
,我不设置“job_position”场在清单创建期间,所以它只是空。用户可以通过在检查清单#显示页面上对检查清单进行排序(在检查清单创建之后)手动设置“作业_位置”。但是我想在创建清单时设置加入记录的job_position属性,以确保我在创建清单时保留/反映用户的实际定位(例如,他们使用“添加新工作“链接)。 注意:这是用于添加使用“添加新作业”链接的作业。在创建清单后,从挑选列表中选择的作业显然需要由用户手动排序。
我该怎么做?
代码
checklist.rb
class Checklist < ActiveRecord::Base
scope :archived_state, lambda {|s| where(:archived => s) }
has_many :checklists_jobs, :dependent => :destroy, :order => 'checklists_jobs.job_position'
has_many :jobs, :through => :checklists_jobs
has_many :unarchived_jobs, :through => :checklists_jobs,
:source => :job,
:conditions => ['checklists_jobs.archived = ?', false], :order => 'checklists_jobs.job_position'
end
job.rb
class Job < ActiveRecord::Base
scope :archived_state, lambda {|s| where(:archived => s)}
has_many :checklists_jobs, :dependent => :destroy
has_many :checklists, :through => :checklists_jobs
end
checklists_job.rb
class ChecklistsJob < ActiveRecord::Base
scope :archived_state, lambda {|s| where(:archived => s) }
belongs_to :job
belongs_to :checklist
attr_accessible :job_position, :job_required
end
_form.html.erb(新清单的形式)
<%= form_for @checklist, :html => { :class => 'form-inline' } do |f| %>
<%= f.text_area :name, :rows => 1, :placeholder => 'Name the list...', :class => 'autoresizer checklist-name' %></br>
<%= f.text_area :description, :rows => 1, :placeholder => 'Optional description...', :class => 'autoresizer' %>
<%= f.fields_for :jobs, :html => { :class => 'form-inline' } do |j| %>
<%= render "job_fields", :j => j %>
<% end %>
<span class="add-new-job-link"><%= link_to_add_fields "add a new job", f, :jobs %></span>
<% unless @job_list.empty? %>
<legend>Add jobs from the Job Bank</legend>
<% @job_list.each do |job| %>
<div class="toggle">
<label class="checkbox text-justify" for="<%=dom_id(job)%>">
<%= check_box_tag "new_jobs[]", job.id, false, id: dom_id(job) %><strong><%= job.name %></strong> <small><%= job.description %></small>
</label>
</div>
<% end %>
<div class="form-actions">
<%= f.submit nil, :class => 'btn btn-primary' %>
<%= link_to 'Cancel', checklists_path, :class => 'btn' %>
</div>
<% end %>
<% end %>
你是怎么解决这个问题的?我仍然不清楚你是如何将这项工作添加到连接表中的列的。 –
@MohamedElMahallawy我使用了acts_as_list gem,并专门将它用于连接表的模型(.rb文件)中。我添加了“acts_as_list:column =>'job_position”...行,以便“job_position”列可以跟踪位置。 acts_as_list宝石本身负责“设定初始位置”。 我认为诀窍是调出列的名称作为职位,因为它不是act_as_list期望的标准“职位”。 – JoshDoody