2013-07-09 15 views
0

我的问题导轨的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 %> 

回答

0

感谢来自朋友的建议,我该用acts_as list gem解决。尽管我需要一些自定义的调整,但实现起来却微不足道。默认值:列是'位置',所以我不得不重写。我还需要一个自定义作用域,因为我将它用于has_many:,通过连接表,并且在该表中有'归档'项目(我不想在更新等上订购)。

下面是必要的代码行,使这些调整:

checklists_job.rb

acts_as_list :column => 'job_position', :scope => 'checklist_id = #{checklist_id} AND archived = false' 

这是简单地添加到我最初包括我的问题的代码。

#147 Sortable Lists (revised)简要提及acts_as_list。这里提到的很简单,主要是因为它的安装和使用非常简单。

+0

你是怎么解决这个问题的?我仍然不清楚你是如何将这项工作添加到连接表中的列的。 –

+0

@MohamedElMahallawy我使用了acts_as_list gem,并专门将它用于连接表的模型(.rb文件)中。我添加了“acts_as_list:column =>'job_position”...行,以便“job_position”列可以跟踪位置。 acts_as_list宝石本身负责“设定初始位置”。 我认为诀窍是调出列的名称作为职位,因为它不是act_as_list期望的标准“职位”。 – JoshDoody

相关问题