在单独的文件中使用DataMapper建模关联

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就是完整性检查您的模型,以确保所有相关模型都是必需的.在需要所有库文件之后,应用程序启动过程是执行此操作的理想位置.我建议像:

project.rb

class Project
  include DataMapper::Resource
  property :id,         Serial
  has n,                :tasks
end
Run Code Online (Sandbox Code Playgroud)

task.rb

class Task
  include DataMapper::Resource
  property :id,         Serial
  belongs_to           :project
end
Run Code Online (Sandbox Code Playgroud)

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!
Run Code Online (Sandbox Code Playgroud)

或者那种性质的东西.在您的应用程序中,您require 'dmconfig'可以根据需要设置所有内容.DataMapper推迟检查关系的远端(例如,任务模型中的项目),直到您调用finalizeauto_upgrade!,因此在执行此操作之前,请确保所有模型都是必需的.