2013-05-21 23 views
0

我有一个Rails 3.1应用程序,我使用DataMapper作为ORM。当Rails应用程序作为控制台和服务器运行时,DataMapper的行为不同

我有以下型号(剥离):

class Task 
    include DataMapper::Resource 
    belongs_to :group 

    def project 
    group && group.project 
    end 
end 

class Group 
    include DataMapper::Resource 
    belongs_to :project 
    has n, :tasks 
end 

class Project 
    include DataMapper::Resource 
    has n, :groups 
end 

我发现,以不同的方式DataMapper的retreives数据时调用Task#project当应用程序运行的服务器和控制台。

当作为服务器运行它试图获取一个组记录,结果是这样的(见PROJECT_ID):

#<Group @id=4 @created_at=Fri, 19 Apr 2013 06:13:25 +0000 @updated_at=Fri, 19 Apr 2013 06:13:25 +0000 @name="In Progress" @weight=<not loaded> @sync_updated_at=<not loaded> @sync_created_at=<not loaded> @capacity=<not loaded> @project_id=nil> 

当作为控制台运行,并通过Group.get(4)手动retreived,结果是这样的(见PROJECT_ID ):

#<Group @id=4 @created_at=Fri, 19 Apr 2013 06:13:25 +0000 @updated_at=Fri, 19 Apr 2013 06:13:25 +0000 @name="In Progress" @weight=<not loaded> @sync_updated_at=<not loaded> @sync_created_at=<not loaded> @capacity=<not loaded> @project_id=1> 

的方法没有猴子补丁:

1.9.1 :060 > Group.instance_method(:project).source_location 
=> ["/var/www/app/shared/bundle/ruby/1.9.1/gems/dm-core-1.2.0/lib/dm-core/model/relationship.rb", 333] 
1.9.1 :061 > Group.instance_method(:project_id).source_location 
=> ["/var/www/app/shared/bundle/ruby/1.9.1/gems/dm-core-1.2.0/lib/dm-core/model/property.rb", 206] 
1.9.1 :062 > Group.instance_method(:project_id=).source_location 
=> ["/var/www/app/shared/bundle/ruby/1.9.1/gems/dm-core-1.2.0/lib/dm-core/model/property.rb", 235] 
1.9.1 :063 > Group.instance_method(:project=).source_location 
=> ["/var/www/app/shared/bundle/ruby/1.9.1/gems/dm-core-1.2.0/lib/dm-core/model/relationship.rb", 358] 

两种情况下的环境都是相同的。

SQL查询是不是在这两种情况下相同,但两者问PROJECT_ID的值:

控制台:

~ SQL (0.038ms) SET sql_auto_is_null = 0 
~ SQL (0.028ms) SET SESSION sql_mode = 'ANSI,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION,NO_UNSIGNED_SUBTRACTION,TRADITIONAL' 
~ SQL (0.033ms) SELECT `id`, `type`, `created_at`, `updated_at`, `name`, `project_id` FROM `groups` WHERE `id` = 3 LIMIT 1 

服务器:

SELECT `id`, `created_at`, `updated_at`, `type`, `name`, `project_id` FROM `groups` WHERE `id` = 3 ORDER BY `id` 

我已经找到了一种解决方法但不应该要求。如果我改变Task#project定义:

def project 
    group && Task.get(group.project_id) 
end 

它成功retreives相关任务。

任何想法可以导致这种差异?

回答

0

检查这些:

  1. 正在运行的控制台和服务器应用程序时,您使用相同的environment

  2. 打开调试模式DataMapper::Logger.new($stdout, :debug)并查看正在执行的实际查询是什么。

如果仍然有问题,与调试模式的输出更新你的问题,这个答案

+0

我已经更新的问题发表评论。 – mspanc

相关问题