如何重构那个复杂的singelton模型方法来在Rails中创建嵌套模型?

时间:2012-11-18 01:43:21

标签: ruby-on-rails ruby-on-rails-3 refactoring

我有以下从控制器切断的复杂方法:

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

我在这里使用了两个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)

基本上我想重构这两行:

1 个答案:

答案 0 :(得分: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,但你为什么要这样做呢?实际上,您只是在公司和雇主(属于一个人)之间创建一个“隐藏”关系。你为什么需要那个?提供更多信息,我可以提供帮助。
  • 还有一件事:建议不要从params中删除密钥,甚至不要直接修改哈希。使用副本。