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

2024-05-02

Context:

我有一个company模型有很多projects,有很多tasks. The company也有很多employees,这又具有许多tasks.

Schema:

Problem:

我正在构建一个表单来创建一个项目,用户可以在其中添加多个tasks。提交后,表格应创建一个project记录,一个或多个task记录与hours and employee_id属性并(!)检查是否employee名称已存在于数据库中或创建一个新名称。

我通过添加 jquery 来解决这个问题autocomplete到表单并定义一个虚拟属性getter and setter我的任务模型中的方法。如同轨道广播 #102 http://railscasts.com/episodes/102-auto-complete-association.

这样就成功设置了employee_id in tasks并创建一个新的employee与员工一起记录name and task_id.

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

My code:

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父模型的属性可用我的 setter 方法Task模型?就像这样:

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>

EDIT:

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

undefined method company_id for nil:NilClass

UPDATE:

仍然没有解决。任何想法为什么project is nil here?


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 

另外,典型的轨道模式,例如你有belongs_to :project,这将添加一个名为的实例方法project to Task,然后可以使用该实例方法来获取与任务关联的项目以及随后关联的项目company_id如果您可能感兴趣

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails:如何在setter方法中使父属性可用 的相关文章

随机推荐