gpt4 book ai didi

ruby - 在单独的文件中使用 DataMapper 的模型关联

转载 作者:数据小太阳 更新时间:2023-10-29 07:24:17 27 4
gpt4 key购买 nike

我正在使用 DataMapper 并尝试使用模型项目和任务之间的关联。我在单独的文件 project.rb 和 task.rb 中有模型。当我尝试将它们相互关联时,出现以下错误:

在项目中找不到任务的 parent_model 项目(NameError)

我认为这是由 project.rb 需要 task.rb 引起的,反之亦然,因为如果我将它包含在其中一个文件中,关联工作正常。这是代码:

项目.rb

require 'dmconfig'
require 'task'

class Project
include DataMapper::Resource
property :id, Serial
has n, :tasks
end

DataMapper.auto_upgrade!
DataMapper.finalize

任务.rb

require 'dmconfig'
require 'project'

class Task
include DataMapper::Resource
property :id, Serial
belongs_to :project
end

DataMapper.auto_upgrade!
DataMapper.finalize

dmconfig.rb

require 'rubygems'
require 'dm-core'
require 'dm-migrations'

DataMapper::Logger.new($stdout, :debug)
DataMapper.setup(:default, 'sqlite://' + Dir.pwd + '/taskmanager.db')

如果我从其中一个文件中删除关联,它工作正常,至少从一个方向:

require 'dmconfig'

class Project
include DataMapper::Resource
property :id, Serial
end

DataMapper.auto_upgrade!
DataMapper.finalize

如果我希望关联从两个方向工作,那么将两个类放在同一个文件中是唯一合理的解决方案吗?或者有什么方法可以让它们分开并仍然管理它?

最佳答案

您需要在需要所有 模型之后调用finalize,而不是在每个模型之后。 finalize 所做的其中一件事是完整性检查您的模型,以确保需要所有相关模型。在需要所有库文件之后的应用程序启动过程是执行此操作的理想场所。我建议像这样:

项目.rb

class Project
include DataMapper::Resource
property :id, Serial
has n, :tasks
end

任务.rb

class Task
include DataMapper::Resource
property :id, Serial
belongs_to :project
end

dmconfig.rb

require 'dm-core'
require 'dm-migrations'
require 'project'
require 'task'

# note that at this point, all models are required!

DataMapper::Logger.new($stdout, :debug)
DataMapper.setup(:default, 'sqlite://' + Dir.pwd + '/taskmanager.db')
DataMapper.finalize
DataMapper.auto_upgrade!

或者类似的东西。在您的应用程序中,您需要“dmconfig” 并根据需要设置所有内容。 DataMapper 推迟检查关系的远端(例如,Task 模型中的项目),直到您调用 finalizeauto_upgrade!,因此请确保在您之前需要所有模型这样做。

关于ruby - 在单独的文件中使用 DataMapper 的模型关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4073628/

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