2011-09-01 173 views
0

我需要一些概念上的幫助:
假設您的用戶本質上是一個業務。你有員工,你有員工職位。基本上,一名員工可以持有多個職位,一個職位可以容納多名員工。
我的have_many:through通過聯合表Staffization在員工和職位之間工作。但是,我的員工編輯表單將所有職位作爲整個應用程序的複選框返回,而不僅僅是針對此特定用戶的複選框。而且,當我提交更新時,沒有人正在保存。 我是否需要做一些與我的關聯不同的事情,還是有更好的方式來縮小表單中的數據?
我的模型:Rails 3 has_many:通過概念

class User < ActiveRecord::Base 
    has_many :employees, :dependent => :destroy 
    has_many :positions, :dependent => :destroy 

class Employee < ActiveRecord::Base 
    belongs_to :user 
    has_many :positions, :through => :staffizations 
    has_many :staffizations, :dependent => :destroy 

class Position < ActiveRecord::Base 
    belongs_to :user 
    has_many :employees, :through => :staffizations 
    has_many :staffizations, :dependent => :destroy 

class Staffization < ActiveRecord::Base 
    belongs_to :employee 
    belongs_to :position 

我的員工編輯字段的形式設置,返回複選框可能位置的員工可以持有,但在整個應用程序返回的所有位置,而不是更新數據時,我打提交:

- Position.all.each do |position| 
    = check_box_tag :position_ids, position.position_name, @employee.positions.include?(position), :name => 'employee[position_ids][]' 
    = label_tag :position_ids, position.position_name 

我的員工控制器更新DEF增加了行了have_many:通過關聯。我是否應該將收益縮小到目前登錄的用戶員工和職位?

@employee.attributes = {'position_ids' => []}.merge(params[:employee] || {}) 

回答

1

將所有位置作爲複選框返回正是你想要的,不是嗎? 如果員工更換職位,該怎麼辦?你需要那個複選框然後,不僅是選中的那個..

+0

感謝您的答覆的輔助用這個!......所有該用戶的複選框,將是一件好事。但是,應用程序中每個用戶的所有複選框都很糟糕。我想知道如果我的問題是在僱員控制器中,我在更新def中添加了上面的行。我不確定是否需要在某處傳入當前用戶的ID。 –

0

感謝一位朋友,因爲我的員工和職位之間的have_many屬於業務。我需要將attr_accessible position_ids和attr_accessible employee_ids添加到相應的模型中。此外,在我的員工的視野,我需要添加的選項,讓我呼籲職位只要求與該業務有關的職位,像這樣:

- Position.find_all_by_user_id(@employee.user_id).each do |position| 
    = check_box_tag :position_ids, position.id, @employee.positions.include?(position), :name => 'employee[position_ids][]' 
    = label_tag :position_ids, position.position_title 
2

首先,你不應該使用:

class Employee 
    has_and_belongs_to_many :positions 
end 

class Position 
    has_and_belongs_to_many :employees 
end 

然後,你可以拉近與可用的位置:

Position.where(:user_id => @employee.user_id).each # etc. 

,你甚至可以使一個範圍吧:

class Position 
    def available_for_employee employee 
    where(:user_id => employee.user_id) 
    end 
end 

...然後在生成您的複選框

def position_checkboxes_for_employee employee 
    Position.available_for_employee(employee).each do |position| 
    = check_box_tag :position_ids, position.position_name, @employee.positions.include?(position), :name => 'employee[position_ids][]' 
    = label_tag :position_ids, position.position_name 
    end 
end 
+0

是的,謝謝,那也行得通... has_many通過has_and_belongs_to_many獲得的好處是關係的連接表,它允許我在將來添加其他屬性。 –