Rails:如何在setter方法中使父属性可用

3

背景:

我有一个包含多个项目和任务的公司模型,同时该公司还拥有许多员工,这些员工也有许多任务

架构:

enter image description here

问题:

我正在构建一个表单来创建项目,用户可以添加多个任务。提交表单后,表单应该创建一个单独的项目记录,一个或多个带有小时数员工ID属性的任务记录,并且检查数据库中是否已存在员工姓名或创建一个新的。

我通过向表单添加jquery的自动完成功能并在我的Task模型中定义具有gettersetter方法的虚拟属性来解决这个问题。类似于Railscast #102

这成功地设置了任务中的员工ID并创建了一个新的员工记录,其中包括员工姓名任务ID

目前的问题是,该模型没有保存公司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

目前出现以下错误:

#<Task:0x98438b8>company_id未定义,无法使用。

编辑:

或者,如果我尝试使用project.company_id,则会告诉我project是一个NilClass:

nil:NilClasscompany_id方法未定义。

更新:

仍未解决。有任何想法为什么这里的projectnil吗?

1个回答

1
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时,这将向Task添加一个名为project的实例方法,该实例方法可用于获取与任务相关联的项目,随后可以使用该关联的company_id(如果有兴趣)。

嗨@Drew,感谢您的回答。我确实自己做到了那一步。我认为我帖子中的问题应该是如何在“Task”模型中访问company_id属性。有什么建议吗? - Matthias
你不会碰巧手头有修改后的代码吧? - Drew
哦,抱歉,换句话说就是“随时可用”或“准备就绪”。 - Drew
另外,回复已修订!如果感兴趣的话。 - Drew
Matthias,猜测任务没有关联的项目。你是在创建新记录吗?或者有什么想法? - Drew
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接