0

快速問題我正面臨一個簡單的問題(我想用作一種方式來理解一些關於關聯和軌道的更深層次的東西)。這裏所說:簡單的關聯體系結構和實現在軌道上的紅寶石

兩個相關的模型

class Employee < ActiveRecord::Base 
    attr_accessible :name 
    attr_accessible :age 

    belongs_to :role 
    attr_accessible :role_id 
end 

class Role < ActiveRecord::Base 
    attr_accessible :title 
    attr_accessible :salary 

    has_many :employees 
end 

讓每一位新員工有一個固定的工資,按他的作用(這是大多數時間的情況下)。但是,如果我想爲特定員工設置不同的薪水,該怎麼辦?

使用simple_form到目前爲止我寫了下面的:

<%= f.input :name, label: 'Employee Name', :required => true %> 
<%= f.association :role, as: :radio_buttons, :required => true %> 
<%= f.input :salary, label: 'Employee Salary', :input_html => { :value => 0 }, :required => true %> 

這當然給了我一個can't mass assign protected attributes: salary錯誤。

爲了解決這個問題,我在Employee模型中加了attr_accessible :salary,但是隻是將錯誤更改爲unknown attribute: salary

根據我的理解,我必須首先改變新員工中的某些內容,然後在員工模型和控制器中進行更改,以便接受薪水值並知道如何處理它,對嗎?

我也看到accepts_nested_attributes_for使用,但我不完全確定它應該去哪個協會的一邊 - 因爲我不完全確定該協會是以最佳方式構建的。

回答

1

你需要一個salary列添加到您的employees表,如果你實際上希望允許自定義工資上的Employee指定。在你的終端,創建一個新的遷移,並將其應用

rails generate migration AddSalaryToEmployees salary:integer 
RAILS_ENV=development rake db:migrate 

順便說一句,你不需要調用attr_accessible多次;它接受符號

attr_accessible :name, :age, :role_id, :salary 

同樣的任意#,既然你提到它,我會對此發表評論:accepts_nested_attributes_for目前在你的模型沒有地方(因爲到目前爲止,還有你的代碼)。


爲了回答您的評論中提出的問題:

不是代碼的重複(有兩款車型我平均工資)?

不,它們有兩個不同的目的。 :salaryRole是應用於與Role相關聯的所有Employees的默認工資。 Employee上的:salary對於Employee的工資不符合與之相關的Role的模具的特殊情況是「覆蓋」。

  • 這將沒有任何意義創建自定義Role只是爲了這個目的(假設自定義工資爲Employee唯一的區別)
  • 你不能改變的Role本身的工資,因爲這將影響與Role

相關的其他Employees的工資,並不需要另一種方法(以確保該角色的工資被設置爲僱員的工資,如果沒有我具體設置)?

另一種方法?否。如果未設置「覆蓋」,則在Employee上定製salary的現有attr_reader以返回Role的默認值?如果你想

def salary 
    return role.salary if read_attribute(:salary).blank? 
    read_attribute(:salary) 
end 
+0

是不是重複的代碼(在我的意思是'工資'在這兩種模式)?並且不需要其他方法(如果沒有特別設置,確保角色薪水設置爲員工的薪水)? (我多次調用'attr_accessible',因爲我不喜歡擁有所有屬性,我想我應該把它叫做一個,然後縮進不同行中的所有屬性) – sebkkom 2013-03-27 17:01:24

+0

我已經更新了我的答案,回答你的問題。 – deefour 2013-03-27 17:07:14

+0

非常感謝,我的印象是,我應該避免你描述的那樣好。感謝您澄清關於'工資'方法。 :) – sebkkom 2013-03-27 17:25:00