我的問題導軌的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