gpt4 book ai didi

ruby-on-rails - rails : How to make available parent attribute in setter method

转载 作者:行者123 更新时间:2023-12-02 03:17:52 26 4
gpt4 key购买 nike

上下文:

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

架构:

enter image description here

问题:

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

我通过添加 jquery autocomplete 来解决这个问题到表单并使用 getter 定义虚拟属性和 setter我的任务模型中的方法。类似于 Railscast #102 .

这成功设置了 employee_idtasks并创建一个新的 employee与员工记录nametask_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父模型的属性可用我的 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>

编辑:

或者,如果我尝试 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,以备不时之需

关于ruby-on-rails - rails : How to make available parent attribute in setter method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35494349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com