上下文:
我有一个 company
许多模型projects
, 有很多 tasks
. company
还有很多employees
,这又有很多tasks
.
架构:
问题:
我正在构建一个表单来创建一个项目,用户可以在其中添加多个 tasks
.提交后,表单应创建一个 project
记录,一个或多个task
记录 hours
和 employee_id
属性和 (!) 检查是否 employee
名称已存在于数据库中或创建一个新名称。
我通过添加 jquery autocomplete
来解决这个问题到表单并使用 getter
定义虚拟属性和 setter
我的任务模型中的方法。类似于 Railscast #102 .
这成功设置了 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
父模型的属性可用我的 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
更新:
仍未解决。任何想法为什么 project
是nil
在这里?
最佳答案
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/