【问题标题】:DataMapper behaving differently when Rails app is run as console and server当 Rails 应用程序作为控制台和服务器运行时,DataMapper 的行为不同
【发布时间】:2013-05-21 17:02:57
【问题描述】:

我有一个 Rails 3.1 应用程序,我使用 DataMapper 作为 ORM。

我有以下模型(已剥离):

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

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

当作为服务器运行时,它会尝试检索组记录,结果如下(参见 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)手动检索时,结果如下(参见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

它成功检索了关联的任务。

有什么想法会导致这种差异吗?

【问题讨论】:

    标签: ruby-on-rails datamapper


    【解决方案1】:

    检查这些:

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

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

    如果您仍有问题,请使用调试模式的输出更新您的问题并对此答案发表评论

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多