0

コントローラーから切り離した次の複雑なメソッドがあります。

def self.create_with_company_and_employer(job_params)
  company_attributes = job_params.delete(:company_attributes)
  employer_attributes = job_params.delete(:employer_attributes)

  new(job_params) do |job|
    job.employer = Employer.find_or_create_by_email(employer_attributes)
    company_attributes[:admin_id] = job.employer.id if Company.find_by_nip(company_attributes[:nip]).nil?
    job.company = Company.find_or_create_by_nip(company_attributes)
    Employment.create(employer_id: job.employer.id, company_id: job.company.id)
  end
end

ここでは、会社と雇用主を作成するために 2 つの nested_attributes 機能を使用しています。

ここにあるコード全体: https://gist.github.com/2c3b52c35df763b6d9b4

company_attributes[:admin_id] = job.employer.id if Company.find_by_nip(company_attributes[:nip]).nil?
Employment.create(employer_id: job.employer.id, company_id: job.company.id)

基本的に、その2行をリファクタリングしたいと思います:

4

1 に答える 1

0

私はあなたの要点を見ました、そして私はこれがデザインの問題だと思います。

  • あなたの雇用モデルと仕事モデルはやや冗長に見えますが、実際の目的が正確にわからないので、今のところこの問題については本当に助けることができません(あなたのスキーマがに属する雇用で改造される可能性があるという予感があります仕事)。ただし、本当に必要な場合は、after_createコールバックを使用してレプリケーションを管理できます。

    class Job < ActiveRecord::Base
      after_create :create_corresponding_employment
    
      def create_corresponding_employment
        Employment.create( employer_id: employer.id, company_id: company.id )
      end
    end
    

    これにより、メソッドの最後の行が削除されます。

  • あなたが取り除きたい他の行はトリッキーです:あなたはあなたの会社にadmin_idを割り当てます、しかしなぜあなたはそれをしたいのですか?実際、あなたは会社と雇用者の間に「隠された」関係を作成しているだけです(belongs_toone)。なぜそれが必要なのですか?より多くの情報を与えてください、そして、私は助けることができます。
  • もう1つ、パラメータからキーを削除したり、ハッシュを直接変更したりすることはお勧めしません。コピーを使用してください。
于 2012-11-18T13:25:47.227 に答える