0

我们最近将我们的 rails 应用程序从版本 3.0.3 升级到了 3.1.0。该应用程序在大多数情况下都像以前一样成功运行,但有一个主要例外。我们在两个模型之间存在多对多关系,SurveyDatum 和 SubGroup,通过一个名为 SubGroupSurveyDatum 的模型连接。这是每个的代码:

class SurveyDatum < ActiveRecord::Base
  has_many :sub_group_survey_data
  has_many :sub_groups, :through => :sub_group_survey_data
end


class SubGroup < ActiveRecord::Base
  has_many :sub_group_survey_data
  has_many :survey_data, :through => :sub_group_survey_data
end

正如您所料:

class SubGroupSurveyDatum < ActiveRecord::Base
  belongs_to :survey_datum
  belongs_to :sub_group
end

如果我有一个之前从数据库中检索到的 SurveyDatum 对象(我们称之为“sd”),并且我调用 sub_groups 方法(sd.sub_groups),这是由活动记录生成的结果 sql 查询:

SELECT `sub_groups`.* FROM `sub_groups` INNER JOIN `sub_group_survey_data` ON `sub_groups`.`id` = `sub_group_survey_data`.`sub_group_id` WHERE `sub_group_survey_data`.`survey_datum_id` IS NULL

“IS NULL”部分显然是我的调查数据对象的 id 应该去的地方,但是活动记录无法使用它。该对象确实有一个 id,因为如前所述,它是从数据库中持久化和检索的。这个问题是在我们迁移到 rails 3.1 之后才出现的,所以我认为我没有按照新版本正确完成某些事情,但我不知道。有任何想法吗?预先感谢您的帮助!

4

2 回答 2

1

嗯,我使用 rails 3.1.0 并尝试复制,但一切都很好。唯一的情况是我手动设置id = nil从数据库检索到的记录。然后我得到:

SELECT "authors".* FROM "authors" INNER JOIN "relations" ON "authors"."id" = "relations"."author_id" WHERE "relations"."post_id" IS NULL

你用的是什么数据库?我正在用 sqlite3 尝试这个。还要注意某些宝石,尤其是那些与 ActiveRecord 一起使用的宝石。我过去在这方面遇到过麻烦。

于 2012-05-24T18:39:09.660 回答
0

我们发现了这个问题。我忘记了survey_data 表有一个复合主键。当我们升级到版本 3.2.3 并在 SurveyDatum 模型中添加以下内容时:

set_primary_key :id

查询最终正确构建并执行。

于 2012-05-25T13:44:08.280 回答