3

语境:

我有一个company模型有很多projects,有很多taskscompany也有很多,而employees后者又有很多tasks

架构:

在此处输入图像描述

问题:

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

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

这成功employee_id地设置tasks并创建了employee员工name和的新记录task_id

目前的问题是模型没有保存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这里?

4

1 回答 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,它会添加一个调用projectto的Task实例方法,然后可以使用该实例方法来获取与任务相关联的项目,然后在company_id可能感兴趣的情况下进行关联

于 2016-02-19T01:12:26.380 回答