0

私が直面している単純な問題についての簡単な質問です (関連付けとレールに関するいくつかのことをより深いレベルで理解する方法として使用したいと思います)。ここに行きます:

関連する 2 つのモデルは次のとおりです。

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 :salaryに、Employeeモデルに追加しましたが、エラーが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現在、あなたのモデルには場所がありません (これまでに示したコードを考えると)。


あなたのコメントで提起された質問に答えるには:

それはコードの重複ではありませんか (つまり、両方のモデルで給与が発生します)。

いいえ、それらは 2 つの異なる目的を果たします。:salaryinは、それに関連付けられているRoleすべてに適用されるデフォルトの給与です。onは、 の給与が関連付けられているの型に合わないという特別な状況のための「上書き」です。EmployeesRole:salaryEmployeeEmployeeRole

  • Roleこの目的のためだけにカスタムを作成するのは意味がありません(カスタム給与が の唯一の違いであると仮定するとEmployee)
  • それ自体の給与を変更することはできません。これは、それに関連付けられているRole他の給与に影響を与えるためです。EmployeesRole

そして、それには別の方法が必要ではありませんか (特に何も設定されていない場合に、役割の給与が従業員の給与として設定されるようにするため)?

別の方法?いいえ。「オーバーライド」が設定されていない場合、既存の attr_reader をsalaryonEmployeeからデフォルトを返すようにカスタマイズしますか? Roleお望みならば

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