繁体   English   中英

Rails:如何在setter方法中提供父属性

[英]Rails: How to make available parent attribute in setter method

语境:

我有一个有很多projectscompany模型,有很多tasks company还拥有许多employees ,而这些employees又有很多tasks

架构:

在此输入图像描述

问题:

我正在构建一个表单来创建一个用户可以添加多个tasks 提交后,表单应创建单个project记录,一个或多个具有hoursemployee_id属性的task记录,并且(!)检查数据库中是否已存在employee姓名或创建新employee名称。

我通过在表单中​​添加jquery autocomplete并在我的Task模型中使用gettersetter方法定义虚拟属性来解决这个问题。 Railscast#102类似。

这成功地将employee_id设置为tasks并使用员工nametask_id创建新的employee记录。

目前的问题是该模型没有保存company_id

我的代码:

class Task < ActiveRecord::Base
    belongs_to :project
    belongs_to :employee

    def employee_name
      employee.try(:name)
    end

    def employee_name=(name)
      self.employee = Employee.find_or_create_by(name: name) if name.present?
    end
end

题:

如何使父模型的company_id属性可用于我的Task模型的setter方法? 像这样:

def shareholder_name=(name)
    self.shareholder = Shareholder.find_or_create_by(name: name, company_id: company_id) if name.present?
end

目前,这会产生错误:

undefined local variable or method "company_id" for #<Task:0x98438b8>

编辑:

或者,如果我尝试project.company_id这告诉我project是一个NilClass:

undefined method company_id for nil:NilClass

更新:

仍未解决。 任何想法,为什么projectnil吗?

class Task < ActiveRecord::Base
  belongs_to :project
  belongs_to :employee

  def shareholder_name=(name)
    self.shareholder = Shareholder.find_or_create_by(name: name, company_id: project.company_id) if name.present?
  end
end 

另外,所有带rails的典型模式,例如你有belongs_to :project ,它会将一个名为project的实例方法添加到Task ,然后该实例方法可用于获取与任务相关联的项目,以及随后可能使用的关联company_id感兴趣

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM