2013-07-09 32 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

相關問題