lob*_*ati 4 ruby datamapper associations
我正在使用DataMapper并尝试使用模型Project和Task之间的关联.我将模型放在单独的文件project.rb和task.rb中.当我尝试将它们彼此关联时,我收到以下错误:
Cannot find the parent_model Project for Task in project (NameError)
我收集这是由project.rb引起的,需要task.rb,反之亦然,因为如果我将它包含在其中一个文件中,则关联工作正常.这是代码:
project.rb
require 'dmconfig'
require 'task'
class Project
include DataMapper::Resource
property :id, Serial
has n, :tasks
end
DataMapper.auto_upgrade!
DataMapper.finalize
Run Code Online (Sandbox Code Playgroud)
task.rb
require 'dmconfig'
require 'project'
class Task
include DataMapper::Resource
property :id, Serial
belongs_to :project
end
DataMapper.auto_upgrade!
DataMapper.finalize
Run Code Online (Sandbox Code Playgroud)
dmconfig.rb
require 'rubygems'
require 'dm-core'
require 'dm-migrations'
DataMapper::Logger.new($stdout, :debug)
DataMapper.setup(:default, 'sqlite://' + Dir.pwd + '/taskmanager.db')
Run Code Online (Sandbox Code Playgroud)
如果我从其中一个文件中删除关联它工作正常,至少从一个方向:
require 'dmconfig'
class Project
include DataMapper::Resource
property :id, Serial
end
DataMapper.auto_upgrade!
DataMapper.finalize
Run Code Online (Sandbox Code Playgroud)
如果我希望关联从两个方向工作是唯一合理的解决方案,只是将两个类放在同一个文件中?或者有没有办法让他们分开并仍然管理它?
小智 9
您需要finalize在需要所有型号后打电话,而不是在每个型号之后打电话.其中一件事finalize就是完整性检查您的模型,以确保所有相关模型都是必需的.在需要所有库文件之后,应用程序启动过程是执行此操作的理想位置.我建议像:
class Project
include DataMapper::Resource
property :id, Serial
has n, :tasks
end
Run Code Online (Sandbox Code Playgroud)
class Task
include DataMapper::Resource
property :id, Serial
belongs_to :project
end
Run Code Online (Sandbox Code Playgroud)
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!
Run Code Online (Sandbox Code Playgroud)
或者那种性质的东西.在您的应用程序中,您require 'dmconfig'可以根据需要设置所有内容.DataMapper推迟检查关系的远端(例如,任务模型中的项目),直到您调用finalize或auto_upgrade!,因此在执行此操作之前,请确保所有模型都是必需的.