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错误。

为了解决这个问题,我添加attr_accessible :salaryEmployee模型中,但这只是将错误更改为unknown attribute: salary.

据我了解,我必须首先在新员工中进行更改,然后在员工模型和控制器中进行更改,以便它接受工资值并知道如何处理它,对吗?

我也见过accepts_nested_attributes_for使用过的,但我不完全确定它应该放在关联的哪一边——因为我也不完全确定关联是以最佳方式构建的。

4

1 回答 1

1

如果您实际上salary希望允许. 在您的终端中,创建一个新的迁移并应用它employeesEmployee

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目前在你的模型中没有位置(鉴于你到目前为止显示的代码)。


要回答您在评论中提出的问题:

那不是代码重复(我的意思是两种模型都有薪水)吗?

不,它们有两个不同的目的。:salaryinRole是适用于所有Employees与 that 相关联的默认薪水Role:salaryonEmployee是一种“覆盖”,用于特殊情况下Employee的薪水不符合Role他们所关联的模式。

  • Role仅仅为此目的创建自定义是没有意义的(假设自定义薪水是唯一的区别Employee
  • 您不能更改Role自己的薪水,因为这会影响Employees与之相关的其他人的薪水Role

并且不需要另一种方法(如果没有专门设置,则确保将角色薪水设置为员工的薪水)?

另一种方法?否。如果尚未设置“覆盖” ,则自定义现有 attr_readersalaryEmployee返回默认值?Role如果你想

def salary
  return role.salary if read_attribute(:salary).blank?
  read_attribute(:salary)
end
于 2013-03-27T16:55:31.050 回答